Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Нужна помощь в алгоритме обработки данных
|
|||
|---|---|---|---|
|
#18+
Добрый день! Переношу свою программу, написанную на Delphi, в PHP. Возникла проблема с обработкой выборок из БД. Имеем выборки вида Код: sql 1. из некоторого количества источников (на данный момент - от 3 до 15). Количество элементов, возвращаемых в выборке для каждого источника может быть от 0 и до нескольких сотен. Необходимо вывести все эти данные в виде таблицы 1 столбец - range по возрастанию, 2й и последующие столбы (по количеству источников) - значение value для данного range или прочерк, если нет данных. В Delphi использовал TDictionary, затем всё просто. А вот как сделать подобное в PHP, чтобы по-минимуму нагружать сервер, - что-то не могу придумать :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 12:50 |
|
||
|
Нужна помощь в алгоритме обработки данных
|
|||
|---|---|---|---|
|
#18+
Вроде как мысль созрела о создании массива с идентификатором range, но как корректно затем совместить в один массив все выборки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 12:54 |
|
||
|
Нужна помощь в алгоритме обработки данных
|
|||
|---|---|---|---|
|
#18+
Алексей Данилов, не совсем понятно в чем сложность? вывести табличку? Или соединить все выборки в одну? в чем разница выборок? на каждую идет такой запрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 15:14 |
|
||
|
Нужна помощь в алгоритме обработки данных
|
|||
|---|---|---|---|
|
#18+
Изначально это даже не запрос, как таковой, а сырые данные с приборов. Поэтому и решалось в Delphi через TDictionary. Но сейчас - да, для каждой таблицы такая выборка (усложнение будет потом). Сложность - объединить результаты в один, с сортировкой по range. В идеале - получить многомерный массив вида [range][value1]...[valueN], где отсутствующие значения value - нулевые. Я могу решить задачу через in_array, последовательно обрабатывая выборки, но мне такой подход кажется чересчур нагружающим сервер. Пробовал решить проблему через JOIN, но меня смущает вариативность числа выборок, да и не совсем понятны ограничения JOIN в MySQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 15:25 |
|
||
|
Нужна помощь в алгоритме обработки данных
|
|||
|---|---|---|---|
|
#18+
Вариативность числа выборок, это что такое? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 15:35 |
|
||
|
Нужна помощь в алгоритме обработки данных
|
|||
|---|---|---|---|
|
#18+
Hett, Это может быть три таблицы в качестве источников, а, может, - пятнадцать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 15:58 |
|
||
|
Нужна помощь в алгоритме обработки данных
|
|||
|---|---|---|---|
|
#18+
можете привести пример исходных данных и что вы хотите получить на выходе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 16:02 |
|
||
|
Нужна помощь в алгоритме обработки данных
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 16:29 |
|
||
|
Нужна помощь в алгоритме обработки данных
|
|||
|---|---|---|---|
|
#18+
in_array - затратная операция на больших объемах данных, но никто не мешает обращаться по индексу, в качестве которого можно использовать id сущности. Конкретно по вашему примеру, - будет проще сделать JOINы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 17:41 |
|
||
|
Нужна помощь в алгоритме обработки данных
|
|||
|---|---|---|---|
|
#18+
Hettin_array - затратная операция на больших объемах данных, но никто не мешает обращаться по индексу, в качестве которого можно использовать id сущности. Конкретно по вашему примеру, - будет проще сделать JOINы Возможно автору и проще будет собрать JOINы, но лично я вижу задачу очень нетривиальной. А самая изюминка в том, что MySQL не поддерживает FULL JOIN Можно было бы имитировать его через UNION, но их же там до 14 в одном запросе возможно. Даже не представляю, как это с UNION собрать. Мне видится что-то такое: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Давно на чистом SQL запросы не писал, возможно по синтаксису ошибки посыпятся ) Но все остальные "сборки" запроса меня жутко пугают сложностью и массивностью (хотя признаюсь, такой вариант при 15-ти таблицах тоже громоздкий очень) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 21:58 |
|
||
|
Нужна помощь в алгоритме обработки данных
|
|||
|---|---|---|---|
|
#18+
Как по мне на пхп проще... foreach для каждой из 15 выборок. Так собираем массив $res[$range]['val'.$tableNum] = $value; потом ksort, а при обращение к значениям делаем так isset($res[$range][$valName]) ? $res[$range][$valName] : NULL; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 22:10 |
|
||
|
Нужна помощь в алгоритме обработки данных
|
|||
|---|---|---|---|
|
#18+
ПрограмёрА самая изюминка в том, что MySQL не поддерживает FULL JOIN Вот на этом я и встал. Но зато Вы предложили value as NULL - спасибо! сам не додумался :( Учитывая, что сегодня приняли решение, что количество выборок всегда будет кратно трём, так что, скорее всего, я скомбинирую оба подхода, т.е. буду делать тройки через UNION, а затем через isset их объединять. Пока непонятно, насколько громоздко будет выглядеть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2016, 06:33 |
|
||
|
Нужна помощь в алгоритме обработки данных
|
|||
|---|---|---|---|
|
#18+
А если сначала объединить все таблички в одну (благо структура у них одинакова) А затем уже делать необходимую выборку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2016, 08:55 |
|
||
|
Нужна помощь в алгоритме обработки данных
|
|||
|---|---|---|---|
|
#18+
Не, не так. 1. Заводим табличку с полями range value1 value2 value3 value4 ..... valueN Где N - максимальное количество обрабатываемых файлов 2. В обрабатываемых файлах название поля должно соответствовать номеру файла. 3. Добавляем все обрабатываемые файла к заведенной табличке. далее - элементарная задача по выборке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2016, 09:01 |
|
||
|
Нужна помощь в алгоритме обработки данных
|
|||
|---|---|---|---|
|
#18+
Алексей ДаниловПрограмёрА самая изюминка в том, что MySQL не поддерживает FULL JOIN Вот на этом я и встал. Но зато Вы предложили value as NULL - спасибо! сам не додумался :( Учитывая, что сегодня приняли решение, что количество выборок всегда будет кратно трём, так что, скорее всего, я скомбинирую оба подхода, т.е. буду делать тройки через UNION, а затем через isset их объединять. Пока непонятно, насколько громоздко будет выглядеть. Имеет право на жизнь. Но оценим плюсы и минусы "гибридного" подхода. Плюсы: 1. Это сократит количество итераций foreach втрое (в найлучшем случае) 2. Это сократит количество запросов втрое Минусы: 1. Громоздкость запросов и их сложная читабельность 2. EXPLAIN по такой выборке даже для двух таблиц выглядит пугающе (для меня). То есть отладка и оптимизация усложняется в разы 3. При использовании подхода на ПХП мы можем каждому запросу присвоить номер и использовать его при нумерации value. В "гибридном" подходе потребуются дополнительные операции 4. Не смотря на уменьшение количество итераций, количество присвоений не изменится. То есть кода больше, а пользы 0. 5. Когда заказчик скажет "Ну да, тогда было кратно трём, но сейчас у нас 4 устройства в системе, а потому и выборки кратны четырём", не придётся писать ни буковки кода в отличие от "гибридного" варианта. В моём понимании минусы более значимые получились чем плюсы (иначе при такой сильной погоне за скоростью, выбор бы не пал на пхп). Моё мнение, лучше перенести всю логику по слиянию таблиц на пхп. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2016, 17:59 |
|
||
|
Нужна помощь в алгоритме обработки данных
|
|||
|---|---|---|---|
|
#18+
Програмёр, в итоге (я сделал скрипт, и он даже работает :) ) - я решил всё через CREATE TEMPORAL TABLE. Без массивов. Во-первых, так вполне итеративно (всё равно mysql_query не позволяет больше одного query за раз), понятно и относительно просто в отладке. Во-вторых, позволяет обойтись без полного JOIN. Плюс, у меня есть такое ощущение, что программное обеспечение, работающее с базой сделает подобные выборки быстрее, нежели мой скрипт будет крутиться в интерпретаторе. (В Delphi, кстати, это было не так - но там у меня 31 ядро в распоряжении, плюс компилятор вместо интерпретатора). В третьих, погонял на тестовом сервере, вполне себе быстро - половина реперных точек самой большой хромосомы секвойи обрабатывается за 3.5 секунды в трёх вариантах. А раз работает - то не трогай :) Спасибо всем за помощь и подсказки! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2016, 18:15 |
|
||
|
|

start [/forum/topic.php?fid=23&msg=39277283&tid=1460995]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
79ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
71ms |
get tp. blocked users: |
1ms |
| others: | 248ms |
| total: | 448ms |

| 0 / 0 |
