powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Шайтан-запрос #2
17 сообщений из 17, страница 1 из 1
Шайтан-запрос #2
    #38961020
NMFES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость


Дано: таблица многие к многим.
Хотелось бы подсчитать уникальные product_id (ИД товаров) которые одновременно имеют option_id = 3 И option_id = 17

Из таблицы выше должно получиться 1 (только один товар имеет обе опции 3 и 17).

Вроде, всё просто, так-сяк пробую, а не то пальто :)

Какой-то бы оператор ONLY_IN(3, 17).
...
Рейтинг: 0 / 0
Шайтан-запрос #2
    #38961027
lamer yuga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А почему бы в фак не добавить раздел про реляционное деление? Ведь часто встречаются такие вопросы...

Например, для деления с остатком (могут быть и другие obj)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select count(*) qty
from tab a
where a.obj=3
and exists(
  select 1
  from tab b
  whera b.obj=17 and b.prod=a.prod
  );


Или для деления нацело (разрешены только 3, 17, и ничего кроме них)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select count(*) qty
from (
  select a.prod
  from tab a
  group by a.prod
  having count(distinct a.obj)=2 
    and min(a.obj)=3 and max(a.obj)=17
  )g;
...
Рейтинг: 0 / 0
Шайтан-запрос #2
    #38961029
lamer yuga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вариант модификации для трех значений
Код: sql
1.
2.
3.
4.
...
having count(distinct obj)=3 
  and group_concat(distinct obj order by obj)='3,5,17'
...
...
Рейтинг: 0 / 0
Шайтан-запрос #2
    #38961031
NMFES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то как-то не по-феншую. Слишком сложно как для подсчета :(
...
Рейтинг: 0 / 0
Шайтан-запрос #2
    #38961032
lamer yuga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NMFES,

гугл в помощь
поиск "реляционное деление"
...
Рейтинг: 0 / 0
Шайтан-запрос #2
    #38961033
NMFES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
lamer yuga,

задумаюсь над изменение структуры, раз тут так сложно подсчет дается.
...
Рейтинг: 0 / 0
Шайтан-запрос #2
    #38961035
lamer yuga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NMFES,

да в чем сложность-то? Нет оператора only_in ?
Ну нет. Структуру нормальную из-за этого ломать? Ваше право
проще? Тоже не вопоос, раз самому гуглить лень
Код: sql
1.
2.
3.
4.
5.
select prod
from tab
where obj in(3,17)
group by prod
having min(obj)<max(obj)
...
Рейтинг: 0 / 0
Шайтан-запрос #2
    #38961042
NMFES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
lamer yuga,

не нравится мне подзапрос.
Сама по себе конструкция может и не особо громоздкая, но среди других более тяжелых запросов на странице на этом хотелось бы сэкономить.
Последний пример уже симпатичней :)
...
Рейтинг: 0 / 0
Шайтан-запрос #2
    #38961047
NMFES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
lamer yuga
Код: sql
1.
2.
3.
4.
5.
select prod
from tab
where obj in(3,17)
group by prod
having min(obj)<max(obj)



Тут возврат именно ИД, а не подсчитанное количество. Без подзапроса на основе примера выше сосчитать не выйдет?
...
Рейтинг: 0 / 0
Шайтан-запрос #2
    #38961051
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NMFESlamer yuga,

не нравится мне подзапрос.
Сама по себе конструкция может и не особо громоздкая, но среди других более тяжелых запросов на странице на этом хотелось бы сэкономить.
Последний пример уже симпатичней :)

что интересно, твои предположения по производительности не верны с точностью до наоборот.
...
Рейтинг: 0 / 0
Шайтан-запрос #2
    #38961066
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NMFES,

согласно поставленной задаче "подсчитать", а не "получить", последний запрос должен выглядеть чуть иначе, типа так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT COUNT(*) AS prodCount
FROM (
  SELECT t.product_id, COUNT(t.option_id) AS cnt
  FROM tbl t
  WHERE t.option_id IN(3,17)
  GROUP BY t.product_id
  HAVING cnt = 2
) tt



не вижу ничего сложного. Впрочем, мало чем отличается от вышеприведенных примеров.
...
Рейтинг: 0 / 0
Шайтан-запрос #2
    #38961076
lamer yuga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arhat109,

Только все же count(distinct ...), а то при (prod, opt, other)={(2,3,5), (2,3,7)} результат будет неверен
...
Рейтинг: 0 / 0
Шайтан-запрос #2
    #38961269
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lamer yuga,

возможно. Пусть автор сам вникает. :)
...
Рейтинг: 0 / 0
Шайтан-запрос #2
    #38961297
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NMFES,
не совсем понятно, что считаем
авторХотелось бы подсчитать уникальные product_id (ИД товаров) которые одновременно имеют option_id = 3 И option_id = 17...Из таблицы выше должно получиться 1 (только один товар имеет обе опции 3 и 17).
...
Рейтинг: 0 / 0
Шайтан-запрос #2
    #38961323
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab, а поняла (тоже попробую)

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT count(distinct product_id)
FROM
(
SELECT product_id, option_id
FROM mytable
WHERE option_ID IN (3,17)
) t1;
...
Рейтинг: 0 / 0
Шайтан-запрос #2
    #38961388
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab, исправление N01

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT count(distinct t1.product_id)
FROM
(
SELECT product_id, option_id
FROM test1 
WHERE option_id=3
)t1
INNER JOIN 
(
SELECT product_id, option_id
FROM test1
WHERE option_id=17
)t2 ON t1.product_id=t2.product_id;
...
Рейтинг: 0 / 0
Шайтан-запрос #2
    #38961406
NMFES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за подсказки. Будем думать, выбирать.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Шайтан-запрос #2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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