Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Нужна помощь в алгоритме обработки данных / 16 сообщений из 16, страница 1 из 1
19.07.2016, 12:50
    #39276193
Нужна помощь в алгоритме обработки данных
Добрый день!
Переношу свою программу, написанную на Delphi, в PHP. Возникла проблема с обработкой выборок из БД.
Имеем выборки вида
Код: sql
1.
SELECT range, value FROM baseN WHERE conditions ORDER by range


из некоторого количества источников (на данный момент - от 3 до 15).
Количество элементов, возвращаемых в выборке для каждого источника может быть от 0 и до нескольких сотен.
Необходимо вывести все эти данные в виде таблицы
1 столбец - range по возрастанию, 2й и последующие столбы (по количеству источников) - значение value для данного range или прочерк, если нет данных.
В Delphi использовал TDictionary, затем всё просто. А вот как сделать подобное в PHP, чтобы по-минимуму нагружать сервер, - что-то не могу придумать :(
...
Рейтинг: 0 / 0
19.07.2016, 12:54
    #39276199
Нужна помощь в алгоритме обработки данных
Вроде как мысль созрела о создании массива с идентификатором range, но как корректно затем совместить в один массив все выборки?
...
Рейтинг: 0 / 0
19.07.2016, 15:14
    #39276350
SharuPoNemnogu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь в алгоритме обработки данных
Алексей Данилов,

не совсем понятно в чем сложность? вывести табличку? Или соединить все выборки в одну? в чем разница выборок? на каждую идет такой запрос?
...
Рейтинг: 0 / 0
19.07.2016, 15:25
    #39276358
Нужна помощь в алгоритме обработки данных
Изначально это даже не запрос, как таковой, а сырые данные с приборов. Поэтому и решалось в Delphi через TDictionary.
Но сейчас - да, для каждой таблицы такая выборка (усложнение будет потом).

Сложность - объединить результаты в один, с сортировкой по range. В идеале - получить многомерный массив вида [range][value1]...[valueN], где отсутствующие значения value - нулевые. Я могу решить задачу через in_array, последовательно обрабатывая выборки, но мне такой подход кажется чересчур нагружающим сервер.
Пробовал решить проблему через JOIN, но меня смущает вариативность числа выборок, да и не совсем понятны ограничения JOIN в MySQL.
...
Рейтинг: 0 / 0
19.07.2016, 15:35
    #39276375
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь в алгоритме обработки данных
Вариативность числа выборок, это что такое?
...
Рейтинг: 0 / 0
19.07.2016, 15:58
    #39276420
Нужна помощь в алгоритме обработки данных
Hett,

Это может быть три таблицы в качестве источников, а, может, - пятнадцать.
...
Рейтинг: 0 / 0
19.07.2016, 16:02
    #39276427
SharuPoNemnogu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь в алгоритме обработки данных
можете привести пример исходных данных и что вы хотите получить на выходе?
...
Рейтинг: 0 / 0
19.07.2016, 16:29
    #39276461
Нужна помощь в алгоритме обработки данных
SharuPoNemnoguможете привести пример исходных данных и что вы хотите получить на выходе?
Да, конечно:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
Запрос 1
1234, 45
2222, 21
10000, 65
11111, 4
<...>

Запрос 2
1234, 12
3222, 4
10001, 6
11111, 4
<...>

Запрос 3
14, 52
320, 75
9999, 11
11111, 111
<...>

Желаемый итог:
14, 0,0,52
320, 0,0,75
1234, 45,12,0
2222, 21,0,0
3222, 0,4,0
9999, 0,0,1
10000, 65,0,0
10001, 0,6,0
11111, 4,4,111
<...>
...
Рейтинг: 0 / 0
19.07.2016, 17:41
    #39276539
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь в алгоритме обработки данных
in_array - затратная операция на больших объемах данных, но никто не мешает обращаться по индексу, в качестве которого можно использовать id сущности.
Конкретно по вашему примеру, - будет проще сделать JOINы
...
Рейтинг: 0 / 0
19.07.2016, 21:58
    #39276693
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь в алгоритме обработки данных
Hettin_array - затратная операция на больших объемах данных, но никто не мешает обращаться по индексу, в качестве которого можно использовать id сущности.
Конкретно по вашему примеру, - будет проще сделать JOINы

Возможно автору и проще будет собрать JOINы, но лично я вижу задачу очень нетривиальной. А самая изюминка в том, что MySQL не поддерживает FULL JOIN

Можно было бы имитировать его через UNION, но их же там до 14 в одном запросе возможно. Даже не представляю, как это с UNION собрать.

Мне видится что-то такое:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT range, MAX(value1), MAX(value2), MAX(value3), MAX(value4) FROM
(
  SELECT range, value as value1, NULL as value2, NULL as value3, NULL as value4 FROM table1
  UNION
  SELECT range, NULL as value1, value as value2, NULL as value3, NULL as value4 FROM table2
  UNION
  SELECT range, NULL as value1, NULL as value2, value as value3, NULL as value4 FROM table3
  UNION
  SELECT range, NULL as value1, NULL as value2, NULL as value3, value as value4 FROM table4
)
GROUP BY range ORDER BY range



Давно на чистом SQL запросы не писал, возможно по синтаксису ошибки посыпятся ) Но все остальные "сборки" запроса меня жутко пугают сложностью и массивностью (хотя признаюсь, такой вариант при 15-ти таблицах тоже громоздкий очень)
...
Рейтинг: 0 / 0
19.07.2016, 22:10
    #39276700
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь в алгоритме обработки данных
Как по мне на пхп проще...
foreach для каждой из 15 выборок. Так собираем массив $res[$range]['val'.$tableNum] = $value;

потом ksort,

а при обращение к значениям делаем так isset($res[$range][$valName]) ? $res[$range][$valName] : NULL;
...
Рейтинг: 0 / 0
20.07.2016, 06:33
    #39276780
Нужна помощь в алгоритме обработки данных
ПрограмёрА самая изюминка в том, что MySQL не поддерживает FULL JOIN


Вот на этом я и встал. Но зато Вы предложили value as NULL - спасибо! сам не додумался :(
Учитывая, что сегодня приняли решение, что количество выборок всегда будет кратно трём, так что, скорее всего, я скомбинирую оба подхода, т.е. буду делать тройки через UNION, а затем через isset их объединять. Пока непонятно, насколько громоздко будет выглядеть.
...
Рейтинг: 0 / 0
20.07.2016, 08:55
    #39276816
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь в алгоритме обработки данных
А если сначала объединить все таблички в одну (благо структура у них одинакова)
А затем уже делать необходимую выборку
...
Рейтинг: 0 / 0
20.07.2016, 09:01
    #39276822
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь в алгоритме обработки данных
Не, не так.
1. Заводим табличку с полями
range
value1
value2
value3
value4
.....
valueN

Где N - максимальное количество обрабатываемых файлов

2. В обрабатываемых файлах название поля должно соответствовать номеру файла.

3. Добавляем все обрабатываемые файла к заведенной табличке.

далее - элементарная задача по выборке.
...
Рейтинг: 0 / 0
20.07.2016, 17:59
    #39277283
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь в алгоритме обработки данных
Алексей ДаниловПрограмёрА самая изюминка в том, что MySQL не поддерживает FULL JOIN


Вот на этом я и встал. Но зато Вы предложили value as NULL - спасибо! сам не додумался :(
Учитывая, что сегодня приняли решение, что количество выборок всегда будет кратно трём, так что, скорее всего, я скомбинирую оба подхода, т.е. буду делать тройки через UNION, а затем через isset их объединять. Пока непонятно, насколько громоздко будет выглядеть.

Имеет право на жизнь. Но оценим плюсы и минусы "гибридного" подхода.
Плюсы:
1. Это сократит количество итераций foreach втрое (в найлучшем случае)
2. Это сократит количество запросов втрое

Минусы:
1. Громоздкость запросов и их сложная читабельность
2. EXPLAIN по такой выборке даже для двух таблиц выглядит пугающе (для меня). То есть отладка и оптимизация усложняется в разы
3. При использовании подхода на ПХП мы можем каждому запросу присвоить номер и использовать его при нумерации value. В "гибридном" подходе потребуются дополнительные операции
4. Не смотря на уменьшение количество итераций, количество присвоений не изменится. То есть кода больше, а пользы 0.
5. Когда заказчик скажет "Ну да, тогда было кратно трём, но сейчас у нас 4 устройства в системе, а потому и выборки кратны четырём", не придётся писать ни буковки кода в отличие от "гибридного" варианта.



В моём понимании минусы более значимые получились чем плюсы (иначе при такой сильной погоне за скоростью, выбор бы не пал на пхп). Моё мнение, лучше перенести всю логику по слиянию таблиц на пхп. :)
...
Рейтинг: 0 / 0
20.07.2016, 18:15
    #39277297
Нужна помощь в алгоритме обработки данных
Програмёр,

в итоге (я сделал скрипт, и он даже работает :) ) - я решил всё через CREATE TEMPORAL TABLE. Без массивов.
Во-первых, так вполне итеративно (всё равно mysql_query не позволяет больше одного query за раз), понятно и относительно просто в отладке.
Во-вторых, позволяет обойтись без полного JOIN. Плюс, у меня есть такое ощущение, что программное обеспечение, работающее с базой сделает подобные выборки быстрее, нежели мой скрипт будет крутиться в интерпретаторе. (В Delphi, кстати, это было не так - но там у меня 31 ядро в распоряжении, плюс компилятор вместо интерпретатора).
В третьих, погонял на тестовом сервере, вполне себе быстро - половина реперных точек самой большой хромосомы секвойи обрабатывается за 3.5 секунды в трёх вариантах. А раз работает - то не трогай :)


Спасибо всем за помощь и подсказки!
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Нужна помощь в алгоритме обработки данных / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]