【问题标题】:Subquerying with a limit有限制的子查询
【发布时间】:2011-05-17 21:35:19
【问题描述】:

我有一个包含类别和主题的网站。某些类别是彼此的父/子(只有一个嵌套级别)。我正在尝试从每个类别系列中选择最新的主题(即最多来自父母或孩子的一个主题)。这是我现在正在尝试的:

SELECT topics.id
FROM topics, categories
WHERE topics.category_id = categories.id
AND ( categories.id IN ( 1, 2, 3 )
      OR categories.parent IN ( 1, 2, 3 ))
ORDER BY topics.posted DESC

如果我按原样运行此查询,它会检索每个主题。如果我在最后添加 LIMIT 1,它只会检索 1 个总数(不是每个家庭 1 个)。如果我在末尾添加LIMIT 3,它将检索所有类别中最新的 3 个。我想要每个类别中的 一个 主题。有什么帮助吗?

【问题讨论】:

    标签: mysql subquery limit


    【解决方案1】:

    有点粗糙,但应该做你想做的:

    SELECT topics.id FROM
      (SELECT MAX(topics.posted) AS date, categories.id AS id
      FROM topics, categories
      WHERE topics.category_id = categories.id
      AND ( categories.id IN ( 1, 2, 3 )
          OR categories.parent IN ( 1, 2, 3 ))
      GROUP BY categories.id) t1
    JOIN topics 
    ON topics.posted = t1.date AND topics.category_id = ti.id
    

    【讨论】:

    • 非常感谢!完美运行
    • 嗯,实际上,如果一个家庭中的最新话题属于父母而不是孩子,它只会从孩子那里拉出一个话题——我想这是因为我们按@987654322 分组@。关于如何解决这个问题的任何想法?再次感谢
    • @andrewtweber 不知道更多关于结构的信息是很难知道的。 . .也许更改为 GROUP BY categories.id, categories.parent - 这将为每个不同的 id-parent 组合选择一个 id。
    • 这没用,但没关系。这将检索每个父母和每个孩子的最新主题,因此我可以使用 PHP 来比较父母/孩子的日期,以找出哪个实际上是最新的。再次感谢:)
    【解决方案2】:

    我相信您正在寻找 GROUP BY:

    SELECT topics.id,MAX(topics.posted) AS postDate
    FROM topics, categories
    WHERE topics.category_id = categories.id
    AND ( categories.id IN ( 1, 2, 3 )      
    OR categories.parent IN ( 1, 2, 3 ))
    GROUP BY topics.category_id
    ORDER BY topics.posted DESC
    

    【讨论】:

    • 这更近了一步,谢谢;它现在正在为每个家庭检索一个主题。但是它没有得到最新的。
    • 它将在每个组中随机检索topics.id
    • 抱歉错过了那部分。您可以将其更改为 SELECT topics.id,MAX(topics.posted) AS postDate FROM...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    相关资源
    最近更新 更多