Вопрос слияния идентификатора MySQL - PullRequest
0 голосов
/ 07 марта 2011

Извините за смутную тему, но мне трудно объяснить это.Я пытаюсь получить идентификатор, представляющий сообщение, которое можно публиковать в разных категориях, и я хочу, чтобы мое сообщение принадлежало всем трем категориям, чтобы соответствовать критериям.Таблица выглядит следующим образом:

id      category_id
1            3
1            4
1            8

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

SELECT id FROM table WHERE category_id = '3' AND category_id = '4' AND category_id = '8';

Это, конечно, вообще ничего не даст, так как ни одна строка не соответствует этому критерию.Я также пробовал с предложением WHERE IN

 SELECT id from table WHERE category_id IN (3, 4, 8);

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

Таким образом, возникает вопрос, есть ли хороший способ поиска идентификатора, который принадлежит всем трем из этих категорий, или я должен использовать предложение WHERE IN и посмотреть, получу ли я 3 строки с идентификатором1, тогда я буду знать, что это произошло три раза, поэтому относится ко всем трем категориям, кажется плохим решением.

Заранее спасибо.Я ценю помощь.:)

Ответы [ 3 ]

1 голос
/ 07 марта 2011

Вы можете использовать group_concat, чтобы получить разделенную запятыми строку идентификаторов вашей категории и проверить, содержит ли она все категории, которые вы фильтруете

ВЫБЕРИТЕ id, GROUP_CONCAT (t2.category_id) как категории ИЗ таблицы AS t1 ВНУТРЕННЯЯ СОЕДИНИТЕЛЬНАЯ СТОРОНА AS t2 ON t1.id = t2.id ГДЕ FIND_IN_SET ('3', категории) НЕ НУЛЬ И FIND_IN_SET ('4', категории) НЕ НУЛЬ И FIND_IN_SET ('8', категории) НЕ ПУСТО

Обновление

SELECT t1.id, GROUP_CONCAT(t2.category_id) as `categories`
FROM `table` AS t1
INNER JOIN `table` AS t2 ON t1.id = t2.id
HAVING
FIND_IN_SET('3', `categories`) IS NOT NULL AND
FIND_IN_SET('4', `categories`) IS NOT NULL AND
FIND_IN_SET('8', `categories`) IS NOT NULL

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

0 голосов
/ 07 марта 2011

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

это можно сделать, применив COUNT и HAVING к SQL-запросу следующим образом:

SELECT id,
       COUNT(category_id) AS categories 
FROM `table` 
GROUP BY id 
HAVING categories > 3

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

SELECT id,
       COUNT(category_id) AS categories 
FROM `table` 
GROUP BY id 
HAVING categories > (
                     SELECT COUNT(category_id) 
                     FROM `categories`
                     )

где categories - таблица, в которой хранится вся информация о ваших категориях

0 голосов
/ 07 марта 2011

Я думаю, вам нужно сказать GROUP BY id вот так:

SELECT id FROM table WHERE category_id = '3' OR category_id = '4' OR category_id = '8'; GROUP BY id;

Надеюсь, что это работает для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...