|
|
|
Поиск записей при связи многие ко многим
|
|||
|---|---|---|---|
|
#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, 12:32 |
|
||
|
Поиск записей при связи многие ко многим
|
|||
|---|---|---|---|
|
#18+
Такие задачи решают группировкой и пост-отбором по наложенным ограничениям.авторНапример: только GoodsID, входящие в категории (2 или 3) и одновременно с этим входящие в категории (5 или 8 или 17) и одновременно в категории (7 или 4). Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2016, 15:13 |
|
||
|
Поиск записей при связи многие ко многим
|
|||
|---|---|---|---|
|
#18+
Akina, Великолепное решение, спасибо большое. Сейчас еще проверю, будет ли такой запрос кэшироваться. С одной стороны, насколько я понимаю, HAVING не оптимизируется встроенным оптимизатором, кроме того, запросы с функциями не кэшируются. С другой стороны, функции то простые, на одном и том же наборе данных должны возвращать одинаковые значения.... Может закэшируется, тогда все вообще идеально будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2016, 23:51 |
|
||
|
Поиск записей при связи многие ко многим
|
|||
|---|---|---|---|
|
#18+
Int_20hHAVING не оптимизируется встроенным оптимизатором,во-первых, что там в принципе можно "оптимизировать"? во-вторых, а разве есть какой-то другой оптимизатор? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2016, 06:54 |
|
||
|
Поиск записей при связи многие ко многим
|
|||
|---|---|---|---|
|
#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:25 |
|
||
|
Поиск записей при связи многие ко многим
|
|||
|---|---|---|---|
|
#18+
Запрос с форматированием из предыдущего сообщения Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2016, 23:28 |
|
||
|
Поиск записей при связи многие ко многим
|
|||
|---|---|---|---|
|
#18+
Пока сделал вложенный запрос: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Есть ли способы эффективнее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2016, 23:43 |
|
||
|
Поиск записей при связи многие ко многим
|
|||
|---|---|---|---|
|
#18+
tanglirInt_20hHAVING не оптимизируется встроенным оптимизатором,во-первых, что там в принципе можно "оптимизировать"? во-вторых, а разве есть какой-то другой оптимизатор? поддерживаю. только exist с подзапросом! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2016, 07:49 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39234394&tid=1831797]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
169ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
2ms |
| others: | 234ms |
| total: | 521ms |

| 0 / 0 |
