powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Нужна помощь в алгоритме обработки данных
16 сообщений из 16, страница 1 из 1
Нужна помощь в алгоритме обработки данных
    #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
Нужна помощь в алгоритме обработки данных
    #39276199
Вроде как мысль созрела о создании массива с идентификатором range, но как корректно затем совместить в один массив все выборки?
...
Рейтинг: 0 / 0
Нужна помощь в алгоритме обработки данных
    #39276350
SharuPoNemnogu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Данилов,

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

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

Это может быть три таблицы в качестве источников, а, может, - пятнадцать.
...
Рейтинг: 0 / 0
Нужна помощь в алгоритме обработки данных
    #39276427
SharuPoNemnogu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можете привести пример исходных данных и что вы хотите получить на выходе?
...
Рейтинг: 0 / 0
Нужна помощь в алгоритме обработки данных
    #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
Нужна помощь в алгоритме обработки данных
    #39276539
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
in_array - затратная операция на больших объемах данных, но никто не мешает обращаться по индексу, в качестве которого можно использовать id сущности.
Конкретно по вашему примеру, - будет проще сделать JOINы
...
Рейтинг: 0 / 0
Нужна помощь в алгоритме обработки данных
    #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
Нужна помощь в алгоритме обработки данных
    #39276700
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как по мне на пхп проще...
foreach для каждой из 15 выборок. Так собираем массив $res[$range]['val'.$tableNum] = $value;

потом ksort,

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


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

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

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

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

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


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

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

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



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

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


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


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