对于模糊的话题感到抱歉,但我很难解释这个问题。我想要做的是获取一个代表帖子的ID,该帖子可以发布在不同的类别中,我希望我的帖子属于所有三个类别以符合标准。该表看起来像这样
id category_id
1 3
1 4
1 8
我想要的是获取属于所有这三个类别的ID,但由于它们位于不同的行上,我无法使用
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);
这将返回任何这些类别中的任何帖子,我想要返回的帖子必须属于所有这三个类别。
所以问题变成了,有没有什么好的方法来查找属于这三个类别的id,或者我是否必须使用WHERE IN子句并查看我是否获得3行ID为1,然后我知道它发生了三次,因此属于所有三个类别,似乎是一个糟糕的解决方案。
提前致谢。我很感激帮助。 :)
答案 0 :(得分:1)
您可以使用group_concat
获取类别ID的逗号分隔字符串,并检查其中是否包含您要过滤的所有类别
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
子句中使用。
答案 1 :(得分:0)
我想你需要这样说GROUP BY id
:
SELECT id FROM table WHERE category_id = '3' OR category_id = '4' OR category_id = '8'; GROUP BY id;
希望对你有用。
答案 2 :(得分:0)
我认为你需要确定一个帖子出现的类别数量。
这可以通过将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
是您存储所有类别信息的表格