powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / вхождение во множество полностью
25 сообщений из 26, страница 1 из 2
вхождение во множество полностью
    #38734501
i'm_novice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе время суток.

Таблица новостей:
Код: sql
1.
2.
3.
4.
CREATE TABLE `news` (
  `object_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор новости',
  PRIMARY KEY (`object_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Новости'


Таблица категорий:
Код: sql
1.
2.
3.
4.
CREATE TABLE `categories` (
  `category_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор категории',
  PRIMARY KEY (`category_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Категории'


Одна новость может быть связана более чем с одной категорией. Для чего есть таблица их связей:
Код: sql
1.
2.
3.
4.
5.
CREATE TABLE `сategory_objects` (
  `category_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Идентификатор категории',
  `object_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Идентификатор объекта',
  PRIMARY KEY (`category_id`,`object_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Принадлежность новостей категориям'



Подскажите, как выбрать в одной ленте все новости, которые:
- принадлежат категориям 1 и 2
или
- принадлежат категориям 3 и 4
или
- принадлежат категориям 5 и 6
...
Рейтинг: 0 / 0
вхождение во множество полностью
    #38734546
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
i'm_noviceПодскажите, как выбрать в одной ленте все новости, которые:
- принадлежат категориям 1 и 2
Код: sql
1.
2.
3.
WHERE category_id IN (1,2)
GROUP BY object_id
HAVING COUNT(/* DISTINCT */ category_id) = 2
...
Рейтинг: 0 / 0
вхождение во множество полностью
    #38734776
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akinai'm_noviceПодскажите, как выбрать в одной ленте все новости, которые:
- принадлежат категориям 1 и 2
Код: sql
1.
2.
3.
WHERE category_id IN (1,2)
GROUP BY object_id
HAVING COUNT(/* DISTINCT */ category_id) = 2



Шаманство.

Лучше в WHERE 2 подзапроса с EXISTS.
...
Рейтинг: 0 / 0
вхождение во множество полностью
    #38734849
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

а что тут такого шаманского?
...
Рейтинг: 0 / 0
вхождение во множество полностью
    #38734947
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЛучше в WHERE 2 подзапроса с EXISTS.А если нужно новость в 3 категориях? в 4? больше? твой запрос с exist-ами быстро превратится в неуправляемого монстра...
...
Рейтинг: 0 / 0
вхождение во множество полностью
    #38734993
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirMasterZiv,

а что тут такого шаманского?

Вот это.
Код: sql
1.
2.
3.
WHERE category_id IN (1,2)
GROUP BY object_id
HAVING COUNT(/* DISTINCT */ category_id) = 2



строго говоря, запрос и неверный, он не проверяет, что ОБЕ категории присутствуют. В запросе два других условия, которые косвенно позволяют иногда делать вывод, что и исходное условие выполняется.

надо добавить ещё одну категорию -- надо править условия в двух местах.

надо потом сгруппировать данные как-то -- нельзя, группировка уже задействована.

надо добавить JOIN -- за JOIN-ится по 1:N случайно более чем одна запись -- всё, запрос неработоспособен.


Это всё достаточно сложно, к сожалению, я сам всегда на собеседованиях слышу от кандидатов вот эту вот вышеприведённую хрень, и к сожалению нет однозначного явного ответа, почему это плохо, потому что действительно ИНОГДА это будет работать.
...
Рейтинг: 0 / 0
вхождение во множество полностью
    #38734996
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaMasterZivЛучше в WHERE 2 подзапроса с EXISTS.А если нужно новость в 3 категориях? в 4? больше?

Будет 3, 4, 5 ... N поздапросов. Каково условие -- таков и запрос.

Akinaтвой запрос с exist-ами быстро превратится в неуправляемого монстра...

Наплевать, что он будет большой. Он превратится в УПРАВЛЯЕМОГО монстра, в отличие от твоего.
Причины описал.
...
Рейтинг: 0 / 0
вхождение во множество полностью
    #38735041
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv строго говоря, запрос и неверный, он не проверяет, что ОБЕ категории присутствуют. В запросе два других условия, которые косвенно позволяют иногда делать вывод, что и исходное условие выполняется.
Чё за бред? запрос именно это и проверяет - наличие по крайней мере одной записи с каждой из категорий списка. Если нет такого - запрос даст пустой набор.

MasterZivпотому что действительно ИНОГДА это будет работать.
Пример, когда НЕ работает - в студию.
...
Рейтинг: 0 / 0
вхождение во множество полностью
    #38735081
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 02.09.2014 16:14, Akina wrote:

> MasterZiv
> потому что действительно ИНОГДА это будет работать.
>
>
> Пример, когда НЕ работает - в студию.

Да я ж говорю, если бы я знал пример, когда эта хрень не работает -- я
бы сразу так и сказал, что твоя хрень не работает.

Например, не будет оно работать, когда нарушается первичный ключ
сategory_objects PRIMARY KEY (`category_id`,`object_id`), но это
неинтересный случай.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
вхождение во множество полностью
    #38735131
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНапример, не будет оно работать, когда нарушается первичный ключ
сategory_objects PRIMARY KEY (`category_id`,`object_id`), но это
неинтересный случай.

Чего-о-о? не понял... предложенный мной текст вообще никак не зависит от индексов - даже если они, как ты выразился, нарушенные. Да и вообще никакой запрос не зависит от ключей - те влияют только на скорость, но никак не на результат.

Само собой, базу, имеющую структурные логические или физические повреждения, мы не рассматриваем.

Хотя... уж коли сказал "например" - дай хотя бы этот пример.
...
Рейтинг: 0 / 0
вхождение во множество полностью
    #38735618
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivнадо добавить ещё одну категорию -- надо править условия в двух местах.Добавить один ид в список и поменять значение счётчика - хуже, чем прилепить энный по счёту экзист?
MasterZivнадо потом сгруппировать данные как-то -- нельзя, группировка уже задействованаЗадача заключается именно в получении списка ид. Под другие условия, может, будет другой запрос.
MasterZivи к сожалению нет однозначного явного ответа, почему это плохо, потому что действительно ИНОГДА это будет работатьИ к сожалению так и нет явного примера, когда это не будет работать.
MasterZivесли бы я знал пример, когда эта хрень не работает -- я
бы сразу так и сказал, что твоя хрень не работает"Нутром чую", да?
...
Рейтинг: 0 / 0
вхождение во множество полностью
    #38736119
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirMasterZivи к сожалению нет однозначного явного ответа, почему это плохо, потому что действительно ИНОГДА это будет работатьИ к сожалению так и нет явного примера, когда это не будет работать.
А я вообще не вижу никаких оснований к тому, чтобы указанный подход НЕ сработал. Хрен с им, с примером - пусть хотя бы кто-то попробует указать логические неувязки подхода либо краевые условия, когда такие неувязки могут возникнуть. Только без словоблудства, конкретно и точно. Я пока таких неувязок не вижу.
...
Рейтинг: 0 / 0
вхождение во множество полностью
    #38736149
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akinatanglirпропущено...
И к сожалению так и нет явного примера, когда это не будет работать.
А я вообще не вижу никаких оснований к тому, чтобы указанный подход НЕ сработал.Поддержу.
До сих пор вариант из поста 16522027 прекрасно много где работал. Как в моей работе, так и у других форумчан.
Он, правда, не лучший по быстродействию, но логически он вполне корректен.
...
Рейтинг: 0 / 0
вхождение во множество полностью
    #38736325
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

поддержу миксофта акину и тангира.
Думаю мастер выразился не совсем то что думал, или не вчитался в этот запрос.

его вариант удабен, если строить запрос через кверибилдер, особенно если разные части запроса в разных частях кода дописываються...его вариант получаеться сдесь гибче, ибо предложеный не подойдёт как он и писал для случая, надо ещо чегото приджоинить.

но...если даный запрос использовать как таблицу с нужными айди...то проблема полностью сниметься и в этом случае... это ещо один джоин дополнительный, который профильтрует на предмет подходящих обджект_айди
...
Рейтинг: 0 / 0
вхождение во множество полностью
    #38736567
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453miksoft,

поддержу миксофта акину и тангира.
Думаю мастер выразился не совсем то что думал, или не вчитался в этот запрос.



Я выразил именно то, что я думаю.
Я так никогда не пишу.
Я уже изложил причины.

Ещё раз, я не говорил, что "тот" запрос неправильный или неработает.
Я просто говорю, что лучше выражать условия в запросе явным образом.
...
Рейтинг: 0 / 0
вхождение во множество полностью
    #38736715
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivлучше выражать условия в запросе явным образом.А что тут неявно? если не считать замечания, что "надо править условия в двух местах", то всё остальное к моему варианту никакого отношения вроде не имеет. Откуда вторая группировка возьмётся? загадка... при чём тут джойны? тоже не очень понятно. Да и по поводу двух правок - вне зависимости от того, сколько категорий в списке отбора, правка всегда будет ровно в двух местах, причём одних и тех же, что мне лично кажется более удобным, чем довешивание условий к тексту запроса.
Насчёт быстродействия - может быть, хотя и тут мне тоже далеко не всё кажется однозначным.
...
Рейтинг: 0 / 0
вхождение во множество полностью
    #38736799
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понятно что код в центре спора работает 100%
для конкретно описаной задачи..
Но интересней посмотреть что МастерЗив имеет
сказать по сути.

Если вдуматся -- группировка -- здесь она как
бы лишняя конструкция -- которая налагает
дополнительные неудобства и даже ограничения.

Например -- если таки нужна группировка для подсчета
других полей.

Или если таки нужен джоинт с другими таблицами --
придется думать что групировать, что не групировать.

Т.е. МастерЗИв конечно не прав нападая на конкретный код,
но обшее недовольство подходом -- имеет право.
...
Рейтинг: 0 / 0
вхождение во множество полностью
    #38736804
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbcНапример -- если таки нужна группировка для подсчета
других полей.

Или если таки нужен джоинт с другими таблицами --
придется думать что групировать, что не групировать.И то, и другое решается убиранием сабжа в подзапрос.
...
Рейтинг: 0 / 0
вхождение во множество полностью
    #38736816
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftjavajdbcНапример -- если таки нужна группировка для подсчета
других полей.

Или если таки нужен джоинт с другими таблицами --
придется думать что групировать, что не групировать.И то, и другое решается убиранием сабжа в подзапрос.

...ну понятно что так или иначе делается...

а вот допустим по логике идет ЛЕФТ жоинт на эту таблицу --
подзапрос убьет использование индексов, не так ли?
...
Рейтинг: 0 / 0
вхождение во множество полностью
    #38736838
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-моему, мы скатываемся к обсуждению достоинств и недостатков некоего объекта в вакууме, зная лишь, что он конь и что сферический. Конкретную бы структуру...

Вот например по LEFT JOIN. Да, подзапрос не даст использовать индексы ЭТОЙ таблицы. Но теперь представьте себе "вес" запроса с EXISTS-ами - сколько там промежуточного барахла накэшируется? да вряд ли меньше... и не факт, что использование индексов обойдётся дешевле, особенно если селективность этой выборки высока. А для результатов EXISTS-ов, если их более одного, всё одно придётся делать сортировку и кросс-джойн перед отбором по индексу.

Насчёт группировки вообще ничего не понял. Задача стоИт выбрать новости - то есть группировка в решении наличествует по дефолту. И если нужно какую-то групповую операцию по новостям - то двойная группировка и соответственно подзапрос мимо никак не проскочат.
...
Рейтинг: 0 / 0
вхождение во множество полностью
    #38736839
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbcmiksoftпропущено...
И то, и другое решается убиранием сабжа в подзапрос.

...ну понятно что так или иначе делается...

а вот допустим по логике идет ЛЕФТ жоинт на эту таблицу --
подзапрос убьет использование индексов, не так ли?

давайте прекращать спор на словах, и посмотрим на дело.

table1(id1,...)

links(id1,id2)

table2(id2,...)


выбор из таблица1 только тех, с которыми связаны записи из таблица2 с айди 1,2,3...10

Код: sql
1.
2.
3.
4.
5.
6.
7.
select id1 
from table1
where
exists(select 'yes' from links where links.id2 = 1 and links.id1=table1.id1) AND
exists(select 'yes' from links where links.id2 = 2 and links.id1=table1.id1) AND
...
exists(select 'yes' from links where links.id2 = 10 and links.id1=table1.id1)



SQL2
Код: sql
1.
2.
3.
4.
5.
6.
select id1
from table1 join links on(links.id1 = table1.id1)
where
links.id2 IN (1,2...10)
group by id1
having count(*) = 10;



второй вариант оформляем ввиде подзапроса
SQL3
Код: sql
1.
2.
3.
4.
select id1
from table1
where
table1.id1 IN (SQL2)



теперь к SQL3 хоть что джоини или групируй или что там ещо, у него просто есть проверка
аля экзист

и сдесь даже дело не в 1 или 10 вложеных селектах, а то что второй подзапрос - это нисходящий (выполняеться один раз до основного запроса)

вто время как 10 с экзистом это 10 корелированных - выполняеться для каждой строчки исходной выборки.

А НАЩОТ ЛОГИКИ

преверить существование 10 определёных связей (связь с определённой записью)

перефразируем - проверить, что связанная група содержит все 10 елементов.

как проверить, что некая група содержит нужные 10 елементов
1 сформировать под-группу, дабы включала только елементы из 10 перечисленых
2 проверить что численость в группе равна численности списка.
...
Рейтинг: 0 / 0
вхождение во множество полностью
    #38737706
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 03.09.2014 21:09, javajdbc wrote:

> Если вдуматся -- группировка -- здесь она как
> бы лишняя конструкция -- которая налагает
> дополнительные неудобства и даже ограничения.
>
> Например -- если таки нужна группировка для подсчета
> других полей.
>
> Или если таки нужен джоинт с другими таблицами --
> придется думать что групировать, что не групировать.


Да, да, и я всё это написал. Только что-то читать как-то не хотят.

> Т.е. МастерЗИв конечно не прав нападая на конкретный код,
> но обшее недовольство подходом -- имеет право.

Ещё раз, я НЕ НАПАДАЛ на конкретный код.
Он рабочий, работоспособный, работающий.
Я не спорил и не спорю, что он работающий.

Я говорил и говорю, что удобнее этот же код писать по-другому,
20 EXISTS, чем так, как этот код написан.

Удобнее для поддержки кода в дальнейшем.



Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
вхождение во множество полностью
    #38737736
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЯ говорил и говорю, что удобнее этот же код писать по-другому,
20 EXISTS, чем так, как этот код написан.

Удобнее для поддержки кода в дальнейшем.Так руками его вроде писать никто и не собирается.
Он же будет автосгенерённый кодом программы/скрипта.

А вот касательно быстродействия: 20 EXISTS-ов - это, наверное, самый медленный вариант, который я знаю.
...
Рейтинг: 0 / 0
вхождение во множество полностью
    #38737762
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 04.09.2014 17:07, miksoft wrote:

> А вот касательно быстродействия: 20 EXISTS-ов - это, наверное, самый
> медленный вариант, который я знаю.

Не, ты не прав.

Он очень запросто может обогнать тот другой, с GROUP BY.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
вхождение во множество полностью
    #38737925
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivможет обогнатьа может и не обогнать...
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / вхождение во множество полностью
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]