|
|
|
Проверка пересечения двух множеств на лету
|
|||
|---|---|---|---|
|
#18+
Имеется php-массив целых чисел. Назовём его $ARR. Имеется таблица table с полем field. Поле field содержит строку вида "4,5,6,7,8,7,64,34434,44,6,8" - т.е. список целых чисел. Задача : в запросе налету отобрать те поля table.field, список которых пересекается со списком ARR Т.е. в идеале необходимо что-то вроде такого: Код: php 1. Но функции INTERSECTED в mySQL нет Другой вариант - в цикле получаем вот такое условие: Код: php 1. 2. 3. 4. 5. Третий вариант: На лету раскладываем список $ARR в отдельные значения (операция, обратная GROUP_CONCAT). В итоге на лету мы получаем таблицу, отражающую связь "М:М" и далее уже делаем элементарную выборку. Только как этот вариант реализовать на лету ? P.S. Требуется найти самый быстрый способ без использования хранимых процедур (функций). Т.е. все операции выполняем на лету. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 13:21:15 |
|
||
|
Проверка пересечения двух множеств на лету
|
|||
|---|---|---|---|
|
#18+
и чем тебе не нравится "другой" вариант? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 13:55:18 |
|
||
|
Проверка пересечения двух множеств на лету
|
|||
|---|---|---|---|
|
#18+
все это очень уродливо,медленно и не рационально с таким подходом зачем нужен mysql? в файл писать-читать быстрее будет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 13:58:20 |
|
||
|
Проверка пересечения двух множеств на лету
|
|||
|---|---|---|---|
|
#18+
On 21.04.2014 14:21, Cyrax_02 wrote: > Имеется php-массив целых чисел. Назовём его $ARR. > Имеется таблица table с полем field. Поле field содержит строку вида > "4,5,6,7,8,7,64,34434,44,6,8" - т.е. список целых чисел. Мужчина, тебе надо почитать о 1-ой нормальной форме и в соответствии с прочитанным модифицировать структуру твоей БД. далее -- просто not in Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 14:01:16 |
|
||
|
Проверка пересечения двух множеств на лету
|
|||
|---|---|---|---|
|
#18+
так хранить Поле field содержит строку вида "4,5,6,7,8,7,64,34434,44,6,8" тоже не рационально ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 14:01:56 |
|
||
|
Проверка пересечения двух множеств на лету
|
|||
|---|---|---|---|
|
#18+
авторвсе это очень уродливо,медленно и не рационально с таким подходом зачем нужен mysql? Реализация модели универсальной БД в одной из CMS не совсем эффективна. Как следствие, приходится решать подобные задачи. Посему, вопрос остаётся в силе. автори чем тебе не нравится "другой" вариант? Нравится, только не исключаю и другие, более эффективные варианты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 14:31:50 |
|
||
|
Проверка пересечения двух множеств на лету
|
|||
|---|---|---|---|
|
#18+
Вариант №3 реализовать слабо ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 14:33:10 |
|
||
|
Проверка пересечения двух множеств на лету
|
|||
|---|---|---|---|
|
#18+
не слабо, но лениво и нужна таблица где количество записей больше или равно количеству элементов в массиве для эмуляции цикла ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 14:42:10 |
|
||
|
Проверка пересечения двух множеств на лету
|
|||
|---|---|---|---|
|
#18+
Cyrax_02На лету раскладываем список $ARR в отдельные значения (операция, обратная GROUP_CONCAT). В итоге на лету мы получаем таблицу, отражающую связь "М:М" и далее уже делаем элементарную выборку. Только как этот вариант реализовать на лету ? Ненадо на лету. Надо стационарно. Если ТУ структуру менять нельзя вообще, то можно сделать дополнительную таблицу, поддерживаемую триггерами на изменение той таблицы, где это уже лежит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 17:38:05 |
|
||
|
Проверка пересечения двух множеств на лету
|
|||
|---|---|---|---|
|
#18+
Если готовить мало сложных запросов (по принципу "все данные в одном запросе"), а не много простых, то имеет место такая ситуация (кто работал с CMS, тот знает): Время генерации страницы CMS'кой в десятки раз превышает время выполнения этих самых (собственноручно составленных) сложных запросов. А у меня как раз мания по составлению сложных запросов. Посему на данный нет никакой необходимости в дополнительных оптимизирующих таблицах (с нормализованными данными). P.S. Особенно, если результаты выполнения запросов кэшировать в оперативной памяти (в пределах одной загрузки страницы), чтобы одни и те же запросы не выполнять несколько раз в процессе генерации страницы. А это я тоже реализовал. Вот и получилось, что даже с такими ненормализованными данными мои запросы выполняются в десятки раз быстрее, чем CMS генерирует страницу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 18:23:03 |
|
||
|
Проверка пересечения двух множеств на лету
|
|||
|---|---|---|---|
|
#18+
Блин. А ведь придётся такую задачу решать. Есть таблица table1 с полем field1 и таблица table2 с полем field2. Оба поля представляют собой строковые списки (например, "1,34,5,78,9"). Необходимо для каждой строки таблицы table1 получить количество строк из таблицы table2, для которых множества пересекаются. Т.е. запрос может быть таким: Код: sql 1. 2. 3. Здесь хранимую функцию INTERSECTED можно и написать. Не вопрос. Только вот проблема в том, что эта функция должна будет отработать очень много раз: число вызовов = произведению количеств строк в таблицах. Т.е. если в каждой из таблиц будет по 1000 записей, функция должна будет отработать 1000 000 раз. Здесь и без тестов можно сказать, что время выполнения такого запроса будет неприемлемым. Возможны 2 варианта: 1. Формировать дополнительные оптимизирующие таблицы, куда будут копироваться те же данные, но в нормализованном виде 2. Напрячь мозг и составить вот такой чудо-запрос: авторНа лету раскладываем список $ARR в отдельные значения (операция, обратная GROUP_CONCAT). В итоге на лету мы получаем таблицу, отражающую связь "М:М" и далее уже делаем элементарную выборку. Только как этот вариант реализовать на лету ? Первый вариант слишком геморройный по трудоёмкости. По второму варианту: для получения таблицы с достаточным числом записей можно взять за основу системную таблицу information_schema или mysql и на лету состряпать из них требуемое декартово произведение. Кто поможет ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 20:24:21 |
|
||
|
Проверка пересечения двух множеств на лету
|
|||
|---|---|---|---|
|
#18+
Модератор: Флуд и оффтоп зачищен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 15:43:47 |
|
||
|
Проверка пересечения двух множеств на лету
|
|||
|---|---|---|---|
|
#18+
было дело, парсили массивы в строках таблица test.testtable содержит одну строку и одну колонку с числами через запятую осталось определить таблицу [table_with_many_rows], которая содержит количество записей >= количества элементов в поле field, с любыми данными, даже из соседней базы, она нам нужна для организации цикла в запросе, если строк не хватит то массив не распарсится [php_array_joined_by_coma] это подстановка массива php Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 16:09:35 |
|
||
|
Проверка пересечения двух множеств на лету
|
|||
|---|---|---|---|
|
#18+
bochkovбыло дело, парсили массивы в строках таблица test.testtable содержит одну строку и одну колонку с числами через запятую осталось определить таблицу [table_with_many_rows], которая содержит количество записей >= количества элементов в поле field, с любыми данными, даже из соседней базы, она нам нужна для организации цикла в запросе, если строк не хватит то массив не распарсится [php_array_joined_by_coma] это подстановка массива php Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Вот еше одно решение на переменных 8434456 . разницу в подходах мы уже несколько раз обсуждали :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 16:23:36 |
|
||
|
Проверка пересечения двух множеств на лету
|
|||
|---|---|---|---|
|
#18+
miksoftМодератор: Флуд и оффтоп зачищен. Это не флуд и оффтоп, это — живое человеческое общение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 20:03:46 |
|
||
|
Проверка пересечения двух множеств на лету
|
|||
|---|---|---|---|
|
#18+
вариант пересечение двух множеств в виде таблицы Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. немного оптимизированный 15917229 для работы в хранимке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2014, 08:34:42 |
|
||
|
Проверка пересечения двух множеств на лету
|
|||
|---|---|---|---|
|
#18+
ну и как решение 15926825 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2014, 09:27:19 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=180&tid=1834930]: |
0ms |
get settings: |
7ms |
get forum list: |
21ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
30ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 340ms |

| 0 / 0 |
