|
|
|
вхождение во множество полностью
|
|||
|---|---|---|---|
|
#18+
Доброе время суток. Таблица новостей: Код: sql 1. 2. 3. 4. Таблица категорий: Код: sql 1. 2. 3. 4. Одна новость может быть связана более чем с одной категорией. Для чего есть таблица их связей: Код: sql 1. 2. 3. 4. 5. Подскажите, как выбрать в одной ленте все новости, которые: - принадлежат категориям 1 и 2 или - принадлежат категориям 3 и 4 или - принадлежат категориям 5 и 6 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2014, 06:02:20 |
|
||
|
вхождение во множество полностью
|
|||
|---|---|---|---|
|
#18+
i'm_noviceПодскажите, как выбрать в одной ленте все новости, которые: - принадлежат категориям 1 и 2 Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2014, 08:51:04 |
|
||
|
вхождение во множество полностью
|
|||
|---|---|---|---|
|
#18+
Akinai'm_noviceПодскажите, как выбрать в одной ленте все новости, которые: - принадлежат категориям 1 и 2 Код: sql 1. 2. 3. Шаманство. Лучше в WHERE 2 подзапроса с EXISTS. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2014, 12:15:53 |
|
||
|
вхождение во множество полностью
|
|||
|---|---|---|---|
|
#18+
MasterZiv, а что тут такого шаманского? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2014, 13:11:54 |
|
||
|
вхождение во множество полностью
|
|||
|---|---|---|---|
|
#18+
MasterZivЛучше в WHERE 2 подзапроса с EXISTS.А если нужно новость в 3 категориях? в 4? больше? твой запрос с exist-ами быстро превратится в неуправляемого монстра... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2014, 14:20:51 |
|
||
|
вхождение во множество полностью
|
|||
|---|---|---|---|
|
#18+
tanglirMasterZiv, а что тут такого шаманского? Вот это. Код: sql 1. 2. 3. строго говоря, запрос и неверный, он не проверяет, что ОБЕ категории присутствуют. В запросе два других условия, которые косвенно позволяют иногда делать вывод, что и исходное условие выполняется. надо добавить ещё одну категорию -- надо править условия в двух местах. надо потом сгруппировать данные как-то -- нельзя, группировка уже задействована. надо добавить JOIN -- за JOIN-ится по 1:N случайно более чем одна запись -- всё, запрос неработоспособен. Это всё достаточно сложно, к сожалению, я сам всегда на собеседованиях слышу от кандидатов вот эту вот вышеприведённую хрень, и к сожалению нет однозначного явного ответа, почему это плохо, потому что действительно ИНОГДА это будет работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2014, 14:46:15 |
|
||
|
вхождение во множество полностью
|
|||
|---|---|---|---|
|
#18+
AkinaMasterZivЛучше в WHERE 2 подзапроса с EXISTS.А если нужно новость в 3 категориях? в 4? больше? Будет 3, 4, 5 ... N поздапросов. Каково условие -- таков и запрос. Akinaтвой запрос с exist-ами быстро превратится в неуправляемого монстра... Наплевать, что он будет большой. Он превратится в УПРАВЛЯЕМОГО монстра, в отличие от твоего. Причины описал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2014, 14:48:17 |
|
||
|
вхождение во множество полностью
|
|||
|---|---|---|---|
|
#18+
MasterZiv строго говоря, запрос и неверный, он не проверяет, что ОБЕ категории присутствуют. В запросе два других условия, которые косвенно позволяют иногда делать вывод, что и исходное условие выполняется. Чё за бред? запрос именно это и проверяет - наличие по крайней мере одной записи с каждой из категорий списка. Если нет такого - запрос даст пустой набор. MasterZivпотому что действительно ИНОГДА это будет работать. Пример, когда НЕ работает - в студию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2014, 15:14:06 |
|
||
|
вхождение во множество полностью
|
|||
|---|---|---|---|
|
#18+
On 02.09.2014 16:14, Akina wrote: > MasterZiv > потому что действительно ИНОГДА это будет работать. > > > Пример, когда НЕ работает - в студию. Да я ж говорю, если бы я знал пример, когда эта хрень не работает -- я бы сразу так и сказал, что твоя хрень не работает. Например, не будет оно работать, когда нарушается первичный ключ сategory_objects PRIMARY KEY (`category_id`,`object_id`), но это неинтересный случай. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2014, 15:31:52 |
|
||
|
вхождение во множество полностью
|
|||
|---|---|---|---|
|
#18+
MasterZivНапример, не будет оно работать, когда нарушается первичный ключ сategory_objects PRIMARY KEY (`category_id`,`object_id`), но это неинтересный случай. Чего-о-о? не понял... предложенный мной текст вообще никак не зависит от индексов - даже если они, как ты выразился, нарушенные. Да и вообще никакой запрос не зависит от ключей - те влияют только на скорость, но никак не на результат. Само собой, базу, имеющую структурные логические или физические повреждения, мы не рассматриваем. Хотя... уж коли сказал "например" - дай хотя бы этот пример. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2014, 15:58:30 |
|
||
|
вхождение во множество полностью
|
|||
|---|---|---|---|
|
#18+
MasterZivнадо добавить ещё одну категорию -- надо править условия в двух местах.Добавить один ид в список и поменять значение счётчика - хуже, чем прилепить энный по счёту экзист? MasterZivнадо потом сгруппировать данные как-то -- нельзя, группировка уже задействованаЗадача заключается именно в получении списка ид. Под другие условия, может, будет другой запрос. MasterZivи к сожалению нет однозначного явного ответа, почему это плохо, потому что действительно ИНОГДА это будет работатьИ к сожалению так и нет явного примера, когда это не будет работать. MasterZivесли бы я знал пример, когда эта хрень не работает -- я бы сразу так и сказал, что твоя хрень не работает"Нутром чую", да? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 05:20:50 |
|
||
|
вхождение во множество полностью
|
|||
|---|---|---|---|
|
#18+
tanglirMasterZivи к сожалению нет однозначного явного ответа, почему это плохо, потому что действительно ИНОГДА это будет работатьИ к сожалению так и нет явного примера, когда это не будет работать. А я вообще не вижу никаких оснований к тому, чтобы указанный подход НЕ сработал. Хрен с им, с примером - пусть хотя бы кто-то попробует указать логические неувязки подхода либо краевые условия, когда такие неувязки могут возникнуть. Только без словоблудства, конкретно и точно. Я пока таких неувязок не вижу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 13:24:55 |
|
||
|
вхождение во множество полностью
|
|||
|---|---|---|---|
|
#18+
Akinatanglirпропущено... И к сожалению так и нет явного примера, когда это не будет работать. А я вообще не вижу никаких оснований к тому, чтобы указанный подход НЕ сработал.Поддержу. До сих пор вариант из поста 16522027 прекрасно много где работал. Как в моей работе, так и у других форумчан. Он, правда, не лучший по быстродействию, но логически он вполне корректен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 13:43:22 |
|
||
|
вхождение во множество полностью
|
|||
|---|---|---|---|
|
#18+
miksoft, поддержу миксофта акину и тангира. Думаю мастер выразился не совсем то что думал, или не вчитался в этот запрос. его вариант удабен, если строить запрос через кверибилдер, особенно если разные части запроса в разных частях кода дописываються...его вариант получаеться сдесь гибче, ибо предложеный не подойдёт как он и писал для случая, надо ещо чегото приджоинить. но...если даный запрос использовать как таблицу с нужными айди...то проблема полностью сниметься и в этом случае... это ещо один джоин дополнительный, который профильтрует на предмет подходящих обджект_айди ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 15:13:01 |
|
||
|
вхождение во множество полностью
|
|||
|---|---|---|---|
|
#18+
alex564657498765453miksoft, поддержу миксофта акину и тангира. Думаю мастер выразился не совсем то что думал, или не вчитался в этот запрос. Я выразил именно то, что я думаю. Я так никогда не пишу. Я уже изложил причины. Ещё раз, я не говорил, что "тот" запрос неправильный или неработает. Я просто говорю, что лучше выражать условия в запросе явным образом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 16:51:00 |
|
||
|
вхождение во множество полностью
|
|||
|---|---|---|---|
|
#18+
MasterZivлучше выражать условия в запросе явным образом.А что тут неявно? если не считать замечания, что "надо править условия в двух местах", то всё остальное к моему варианту никакого отношения вроде не имеет. Откуда вторая группировка возьмётся? загадка... при чём тут джойны? тоже не очень понятно. Да и по поводу двух правок - вне зависимости от того, сколько категорий в списке отбора, правка всегда будет ровно в двух местах, причём одних и тех же, что мне лично кажется более удобным, чем довешивание условий к тексту запроса. Насчёт быстродействия - может быть, хотя и тут мне тоже далеко не всё кажется однозначным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 18:25:32 |
|
||
|
вхождение во множество полностью
|
|||
|---|---|---|---|
|
#18+
Понятно что код в центре спора работает 100% для конкретно описаной задачи.. Но интересней посмотреть что МастерЗив имеет сказать по сути. Если вдуматся -- группировка -- здесь она как бы лишняя конструкция -- которая налагает дополнительные неудобства и даже ограничения. Например -- если таки нужна группировка для подсчета других полей. Или если таки нужен джоинт с другими таблицами -- придется думать что групировать, что не групировать. Т.е. МастерЗИв конечно не прав нападая на конкретный код, но обшее недовольство подходом -- имеет право. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 20:09:46 |
|
||
|
вхождение во множество полностью
|
|||
|---|---|---|---|
|
#18+
javajdbcНапример -- если таки нужна группировка для подсчета других полей. Или если таки нужен джоинт с другими таблицами -- придется думать что групировать, что не групировать.И то, и другое решается убиранием сабжа в подзапрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 20:24:05 |
|
||
|
вхождение во множество полностью
|
|||
|---|---|---|---|
|
#18+
miksoftjavajdbcНапример -- если таки нужна группировка для подсчета других полей. Или если таки нужен джоинт с другими таблицами -- придется думать что групировать, что не групировать.И то, и другое решается убиранием сабжа в подзапрос. ...ну понятно что так или иначе делается... а вот допустим по логике идет ЛЕФТ жоинт на эту таблицу -- подзапрос убьет использование индексов, не так ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 20:51:24 |
|
||
|
вхождение во множество полностью
|
|||
|---|---|---|---|
|
#18+
По-моему, мы скатываемся к обсуждению достоинств и недостатков некоего объекта в вакууме, зная лишь, что он конь и что сферический. Конкретную бы структуру... Вот например по LEFT JOIN. Да, подзапрос не даст использовать индексы ЭТОЙ таблицы. Но теперь представьте себе "вес" запроса с EXISTS-ами - сколько там промежуточного барахла накэшируется? да вряд ли меньше... и не факт, что использование индексов обойдётся дешевле, особенно если селективность этой выборки высока. А для результатов EXISTS-ов, если их более одного, всё одно придётся делать сортировку и кросс-джойн перед отбором по индексу. Насчёт группировки вообще ничего не понял. Задача стоИт выбрать новости - то есть группировка в решении наличествует по дефолту. И если нужно какую-то групповую операцию по новостям - то двойная группировка и соответственно подзапрос мимо никак не проскочат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 21:30:48 |
|
||
|
вхождение во множество полностью
|
|||
|---|---|---|---|
|
#18+
javajdbcmiksoftпропущено... И то, и другое решается убиранием сабжа в подзапрос. ...ну понятно что так или иначе делается... а вот допустим по логике идет ЛЕФТ жоинт на эту таблицу -- подзапрос убьет использование индексов, не так ли? давайте прекращать спор на словах, и посмотрим на дело. table1(id1,...) links(id1,id2) table2(id2,...) выбор из таблица1 только тех, с которыми связаны записи из таблица2 с айди 1,2,3...10 Код: sql 1. 2. 3. 4. 5. 6. 7. SQL2 Код: sql 1. 2. 3. 4. 5. 6. второй вариант оформляем ввиде подзапроса SQL3 Код: sql 1. 2. 3. 4. теперь к SQL3 хоть что джоини или групируй или что там ещо, у него просто есть проверка аля экзист и сдесь даже дело не в 1 или 10 вложеных селектах, а то что второй подзапрос - это нисходящий (выполняеться один раз до основного запроса) вто время как 10 с экзистом это 10 корелированных - выполняеться для каждой строчки исходной выборки. А НАЩОТ ЛОГИКИ преверить существование 10 определёных связей (связь с определённой записью) перефразируем - проверить, что связанная група содержит все 10 елементов. как проверить, что некая група содержит нужные 10 елементов 1 сформировать под-группу, дабы включала только елементы из 10 перечисленых 2 проверить что численость в группе равна численности списка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 21:31:03 |
|
||
|
вхождение во множество полностью
|
|||
|---|---|---|---|
|
#18+
On 03.09.2014 21:09, javajdbc wrote: > Если вдуматся -- группировка -- здесь она как > бы лишняя конструкция -- которая налагает > дополнительные неудобства и даже ограничения. > > Например -- если таки нужна группировка для подсчета > других полей. > > Или если таки нужен джоинт с другими таблицами -- > придется думать что групировать, что не групировать. Да, да, и я всё это написал. Только что-то читать как-то не хотят. > Т.е. МастерЗИв конечно не прав нападая на конкретный код, > но обшее недовольство подходом -- имеет право. Ещё раз, я НЕ НАПАДАЛ на конкретный код. Он рабочий, работоспособный, работающий. Я не спорил и не спорю, что он работающий. Я говорил и говорю, что удобнее этот же код писать по-другому, 20 EXISTS, чем так, как этот код написан. Удобнее для поддержки кода в дальнейшем. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2014, 15:51:30 |
|
||
|
вхождение во множество полностью
|
|||
|---|---|---|---|
|
#18+
MasterZivЯ говорил и говорю, что удобнее этот же код писать по-другому, 20 EXISTS, чем так, как этот код написан. Удобнее для поддержки кода в дальнейшем.Так руками его вроде писать никто и не собирается. Он же будет автосгенерённый кодом программы/скрипта. А вот касательно быстродействия: 20 EXISTS-ов - это, наверное, самый медленный вариант, который я знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2014, 16:07:31 |
|
||
|
вхождение во множество полностью
|
|||
|---|---|---|---|
|
#18+
On 04.09.2014 17:07, miksoft wrote: > А вот касательно быстродействия: 20 EXISTS-ов - это, наверное, самый > медленный вариант, который я знаю. Не, ты не прав. Он очень запросто может обогнать тот другой, с GROUP BY. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2014, 16:22:40 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=164&tid=1834279]: |
0ms |
get settings: |
5ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
30ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 196ms |
| total: | 298ms |

| 0 / 0 |
