【问题标题】:MySQL: group by and IF statementMySQL:group by 和 IF 语句
【发布时间】:2010-05-18 20:03:27
【问题描述】:

默认情况下,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 的记录不应超过一条。

有什么解决办法?

【问题讨论】:

  • “最后一个”是什么意思?你是指最后几个进入数据库的吗?
  • 当您说“只有 parent_id > 0 的最后一个”时,您必须定义“最后一个”。然后有人可以回答。
  • “最后一个”是什么意思?没有其他文章将其称为父级的文章?
  • 我的意思是,如果有几条 parent_id = 2 的记录,则应该只返回其中一条。此外,如果有许多 parent_id = 5 的记录,则只返回其中一个。换句话说,除了 parent_id = 0 的记录之外,每个 parent_id 的记录不应超过一条。

标签: sql mysql group-by


【解决方案1】:

如果我理解你的问题,你需要 parent_id == 0 的所有记录,并且只需要其他 parent_id 的“时间”列的最大值记录吗?我想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 - 我认为这是我试图描述的更好的版本。尽管考虑到 WHERE 子句不允许重复,但可能会使用 UNION ALL 而不是 UNION。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我认为您希望将其作为两个查询进行,并使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-27
      • 2023-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-21
      • 2016-03-02
      • 2016-02-29
      相关资源
      最近更新 更多