繁体   English   中英

特殊的MySQL查询

[英]Particular MySql Query

拥有下表

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"]

等等。

我需要这个,以便通过一个查询获得EACH类别的第一篇N文章(因此,无需询问特定类别,而是针对表中的所有类别)

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

您可以使用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

需要DUMMY表别名以允许在每个子查询中进行排序

该查询将满足您的需求。 如果任何类别的帖子少于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小提琴

UPDATE

针对您的评论和更新的问题:

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 ''
    )
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM