【问题标题】:Particular MySql Query特定的 MySql 查询
【发布时间】:2015-09-08 04:12:57
【问题描述】:

有以下表格

Post(*id, name, description, cat, publish_date)
Category(*id, name)

可以在一个查询中获取(最大)每个不同类别的前 N ​​个元素吗?

假设 N=3,我需要以下结果:

结果集:

["1", "Name1","Descr","cat1"]
["2", "Name1","Descr","cat1"]
["3", "Name1","Descr","cat1"]
["10","Name1","Descr","cat2"]
["20","Name1","Descr","cat2"]
["22","Name1","Descr","cat2"]
["25","Name1","Descr","cat3"]
["30","Name1","Descr","cat3"]
["19","Name1","Descr","cat3"]

等等。

我需要这个,以获取每个类别的前 N ​​篇文章,通过一个查询(因此不要求特定类别,而是表中的所有类别)

有可能吗?如果是,那么正确的查询是什么?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您可以使用UNION 将多个查询合并为一个。这假设您知道您为每个集合选择的type

    SELECT * FROM 
    (
      SELECT * FROM T1 WHERE type='Type1' ORDER BY id DESC LIMIT 3
    ) DUMMY1
    
    UNION ALL
    
    SELECT * FROM 
    (
      SELECT * FROM T1 WHERE type='Type2' ORDER BY id DESC LIMIT 3
    ) DUMMY2
    
    UNION ALL
    
    SELECT * FROM 
    (
      SELECT * FROM T1 WHERE type='Type3' ORDER BY id DESC LIMIT 3
    ) DUMMY3
    

    allow ordering within each subquery 需要 DUMMY 表别名。

    【讨论】:

    • 类型存储在其他表中,有没有办法通过循环或其他方式查询所有类型?
    • 你可以JOIN这个表到另一个表的每个子查询。例如:SELECT * FROM T1 JOIN T2 ON T1.id=T2.id WHERE T2.type='Type3' ORDER BY T1.id DESC LIMIT 3
    • 对不起,我不是这个意思。我编辑了帖子,请检查更正。非常感谢您的帮助。
    【解决方案2】:

    此查询将满足您的需求。如果任何类别的帖子少于 3 个,它仍然有效。

    SELECT P.id,P.name,P.description,C.name 
    FROM Post P
    LEFT JOIN Category C
    ON P.type = C.id
    WHERE FIND_IN_SET(P.id,
        (
            SELECT GROUP_CONCAT(ids) FROM
                (SELECT SUBSTRING_INDEX(GROUP_CONCAT(id),',',3) as ids
                    FROM Post 
                    GROUP BY type
                ) AS foo
            GROUP BY ''
        )
    )
    

    这是一个有效的SQL Fiddle

    更新

    回应您的评论和更新的问题:

    SELECT P.id,P.name,P.description,P.publish_date,C.name 
    FROM Post P
    LEFT JOIN Category C
    ON P.type = C.id
    WHERE FIND_IN_SET(P.id,
        (
            SELECT GROUP_CONCAT(ids) FROM
                (SELECT SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY publish_date DESC),',',3) as ids
                    FROM Post
                    GROUP BY type      
                ) AS foo
            GROUP BY ''
        )
    )
    

    【讨论】:

    • 如果要按日期订购帖子,此查询如何更改,以便我可以获得每个类别的最后 3 个帖子?
    • 日期列在哪里?在Post 表中?
    • 是的,名字是publish_date
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多