2010-05-18 98 views
0

默认情况下,parent_id = 0我想和parent_id = 0,选择所有记录,只有最后的与parent_id> 0MySQL的:GROUP BY和IF语句

我想这一点,但它并没有工作:

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的记录不应超过一条。

可能的解决方案是什么?

+2

你是什么意思的“最后的”?你的意思是最后几个输入数据库? – eykanal 2010-05-18 20:06:54

+0

当你说“只有parent_id> 0的最后一个”时,你必须定义“last”。然后有人可以回答。 – MJB 2010-05-18 20:07:28

+0

'最后一个'是什么意思?没有其他文章提及它作为父母的文章? – 2010-05-18 20:08:15

回答

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; 
+0

+1 - 我认为这是我试图描述的更好的版本。尽管考虑WHERE子句不允许重复,但可以使用UNION ALL而不是UNION。 – 2010-05-18 20:20:23

0

您将所有概念混合在一起。 WHERE,GROUP 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个孩子的文章的所有父母文章的身份。

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