MySQL id合并问题

时间:2011-03-07 10:35:25

标签: mysql merge

对于模糊的话题感到抱歉,但我很难解释这个问题。我想要做的是获取一个代表帖子的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,然后我知道它发生了三次,因此属于所有三个类别,似乎是一个糟糕的解决方案。

提前致谢。我很感激帮助。 :)

3 个答案:

答案 0 :(得分:1)

您可以使用group_concat获取类别ID的逗号分隔字符串,并检查其中是否包含您要过滤的所有类别

<德尔>     SELECT id,GROUP_CONCAT(t2.category_id)作为类别     FROM表AS t1     INNER JOIN表AS t2 ON t1.id = t2.id     哪里     FIND_IN_SET('3',类别)不是NULL和     FIND_IN_SET('4',类别)不是NULL和     FIND_IN_SET('8',类别)不是NULL

更新

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)

我认为你需要确定一个帖子出现的类别数量。

这可以通过将COUNTHAVING应用于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是您存储所有类别信息的表格