MySQL:group by和IF语句

时间:2010-05-18 20:03:28

标签: sql mysql group-by

默认情况下,parent_id = 0.我想选择parent_id = 0的所有记录,而只选择parent_id>的最后一个记录。 0

我尝试了这个,但它不起作用:

SELECT * FROM `articles`
  IF `parent_id` > 0 THEN
GROUP BY `parent_id`
HAVING COUNT(`parent_id`) >= 1
END;
ORDER BY `time` DESC

我的意思是,如果有几条记录,其中parent_id = 2,则只返回其中一条记录。此外,如果有一些parent_id = 5的记录,则只返回其中一个记录。换句话说,除了parent_id = 0之外,每个parent_id的记录不应超过一个。

可能是什么解决方案?

3 个答案:

答案 0 :(得分:1)

如果我理解你的问题很好,你需要所有带有parent_id == 0的记录,并且只有其他parent_id的'time'列值最大的记录?我认为parent_id + time是唯一的。

 SELECT a.* FROM `articles` a 
 INNER JOIN 
 (SELECT parent_id, MAX(`time`) AS `time` FROM `articles` WHERE parent_id >0) t
 ON (t.parent_id = a.parent_id AND a.`time` = t.`time`)

 UNION
 SELECT * FROM `articles` WHERE parent_id = 0;

答案 1 :(得分:0)

你将所有概念混合在一起。 WHEREGROUP BYHAVING执行不同的操作。您可能需要更彻底地阅读此页面:

http://dev.mysql.com/doc/refman/5.1/en/select.html

但如果我对你正在做的事情做出一些假设......

您可能想从这一部分开始:

SELECT * FROM articles WHERE parent_id > 0

但现在您想将具有相同父级的文章组合在一起。假设每篇文章都有一个id,也许你想要

SELECT parent_id, COUNT(*) AS article_count FROM articles WHERE parent_id >= 0 GROUP BY parent_id

现在,所有这些行都将是至少包含一篇子文章的parent_id值,但如果您只想查看包含2篇以上子文章的父级,则可能需要:

SELECT parent_id, COUNT(*) AS article_count
FROM articles
WHERE parent_id >= 0
GROUP BY parent_id
HAVING article_count >= 2

这将显示至少包含2篇儿童文章的所有父文章的身份。

答案 2 :(得分:0)

我认为您希望将其作为两个查询进行,并使用UNION加入结果。我的帖子中确实没有足够的信息来确定它的外观,但也许是这样的:

SELECT parent_id, time FROM articles WHERE parent_id = 0
UNION ALL
SELECT parent_id, MAX(TIME) FROM articles WHERE parent_id > 0
GROUP BY parent_id