
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
12.05.2016, 12:32
|
|||
|---|---|---|---|
|
|||
Поиск записей при связи многие ко многим |
|||
|
#18+
Имеется запрос вида Код: sql 1. связь Goods с Categories - многие ко многим через таблицу Goods_Categories Необходимо отбирать GoodsID, входящие в категории, как по правилу И, так и ИЛИ. Например: только GoodsID, входящие в категории (2 или 3) и одновременно с этим входящие в категории (5 или 8 или 17) и одновременно в категории (7 или 4). При таком запросе из таблицы вида: GoodsID CategoriesID 1 2 1 8 1 4 2 1 2 2 2 6 должен быть отобран только GoodsID = 1. Пока приходит в голову только вложенная структура с кучей объединений, что наверное не правильно. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Сейчас в таблице 17 000 записей. При 3 джоинах они превращаются в 2 509 528. А если таких джоинов будет 5 или 6?!!! Подскажите, какими методами обычно решают подобные задачи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.05.2016, 15:13
|
|||
|---|---|---|---|
Поиск записей при связи многие ко многим |
|||
|
#18+
Такие задачи решают группировкой и пост-отбором по наложенным ограничениям.авторНапример: только GoodsID, входящие в категории (2 или 3) и одновременно с этим входящие в категории (5 или 8 или 17) и одновременно в категории (7 или 4). Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.05.2016, 23:51
|
|||
|---|---|---|---|
|
|||
Поиск записей при связи многие ко многим |
|||
|
#18+
Akina, Великолепное решение, спасибо большое. Сейчас еще проверю, будет ли такой запрос кэшироваться. С одной стороны, насколько я понимаю, HAVING не оптимизируется встроенным оптимизатором, кроме того, запросы с функциями не кэшируются. С другой стороны, функции то простые, на одном и том же наборе данных должны возвращать одинаковые значения.... Может закэшируется, тогда все вообще идеально будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.05.2016, 06:54
|
|||
|---|---|---|---|
Поиск записей при связи многие ко многим |
|||
|
#18+
Int_20hHAVING не оптимизируется встроенным оптимизатором,во-первых, что там в принципе можно "оптимизировать"? во-вторых, а разве есть какой-то другой оптимизатор? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.05.2016, 23:25
|
|||
|---|---|---|---|
|
|||
Поиск записей при связи многие ко многим |
|||
|
#18+
Akina, Все реализовал, производительность на высоте, спасибо огромное. Но возникла одна сложность, которую пока не знаю, как обойти. Иногда нужно считать количество товаров в выборке. Раньше я просто делал count в селекте и все: select count(distinct GoodsGen.GoodsID) from GoodsGen left join GoodsGroups using (GoodsID) left join GoodsCategories using (GoodsID) where GoodsGen.Deleted = 0 and GoodsGen.Archived = 0 and GoodsGroups.GroupsID in (79) group by GoodsGen.GoodsID having SUM(GoodsCategories.CategoriesContentsID in (136)) order by GoodsGen.OrderNum asc Сейчас же он считает строки внутри Group by и я получаю все строки с единицами. Как лучше обойти данную проблему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.05.2016, 23:28
|
|||
|---|---|---|---|
|
|||
Поиск записей при связи многие ко многим |
|||
|
#18+
Запрос с форматированием из предыдущего сообщения Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.05.2016, 23:43
|
|||
|---|---|---|---|
|
|||
Поиск записей при связи многие ко многим |
|||
|
#18+
Пока сделал вложенный запрос: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Есть ли способы эффективнее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
15.05.2016, 07:49
|
|||
|---|---|---|---|
Поиск записей при связи многие ко многим |
|||
|
#18+
tanglirInt_20hHAVING не оптимизируется встроенным оптимизатором,во-первых, что там в принципе можно "оптимизировать"? во-вторых, а разве есть какой-то другой оптимизатор? поддерживаю. только exist с подзапросом! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=47&tablet=1&tid=1831797]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
186ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 279ms |
| total: | 542ms |

| 0 / 0 |
