MySql: выберите элементы, которые имеют все значения

mysql

45 просмотра

2 ответа

1411 Репутация автора

У меня есть таблица Mysql с 3 столбцами: id, company_id и tag_id. Он используется для связи компаний и тегов. Схема таблицы:

CREATE TABLE tbl_company_tag_link (
  id BIGINT NOT NULL AUTO_INCREMENT,
  company_id BIGINT NOT NULL,
  tag_id BIGINT NOT NULL,
  PRIMARY KEY(id)
);

Любая компания может быть связана с любым количеством тегов. Мне нужно выбрать компании, к которым прикреплены ВСЕ указанные теги. Например, мне нужен company_id с tag_id = 1,2,3 (все они!). Запрос, на который я пришел, выглядит ужасно:

SELECT company_id, GROUP_CONCAT(tag_id) as group_concat_tag_id
FROM tbl_company_tag_link
WHERE tag_id IN (1,2,3)
GROUP BY company_id
HAVING group_concat_tag_id = "1,2,3"

Мне нужна помощь в написании запроса, это было бы быстро.

Я создал sqlfiddle со своей схемой и запросом для быстрого тестирования: http://sqlfiddle.com/#!9/2416f/2

слишком поздно, нашел тот же вопрос с подробными ответами: Нужна помощь с SQL-запросом, чтобы найти вещи, помеченные всеми указанными тегами

Автор: MihanEntalpo Источник Размещён: 06.11.2015 08:22

Ответы (2)


0 плюса

4590 Репутация автора

SQL Fiddle не загружается, но вы можете попробовать это:

SELECT company_id, GROUP_CONCAT(tag_id) as group_concat_tag_id
FROM tbl_company_tag_link
WHERE tag_id IN (1,2,3)
GROUP BY company_id
HAVING COUNT(*) = 3;
Автор: Kostas Mitsarakis Размещён: 06.11.2015 08:31

2 плюса

135579 Репутация автора

Решение

Вы можете попробовать это:

SELECT company_id
FROM tbl_company_tag_link
WHERE tag_id IN (1,2,3)
GROUP BY company_id
HAVING COUNT(DISTINCT tag_id ) = 3

SQL FIDDLE DEMO

Автор: Rahul Tripathi Размещён: 06.11.2015 08:33
Вопросы из категории :
32x32