【问题标题】:SQL select five of this and five of that [closed]SQL选择其中的五个和其中的五个[关闭]
【发布时间】:2013-03-31 14:07:31
【问题描述】:

有什么方法可以单次选择从汽车表中获取 10 辆最新汽车,其中 5 辆是红色的,其中 5 辆是蓝色的?

我能想到的最好的方法是两个选择和一个程序化合并:

red  = query("select * from cars where color = 'red'  order by when desc limit 5")
blue = query("select * from cars where color = 'blue' order by when desc limit 5")
all = merge(red, blue)

【问题讨论】:

  • 你已经用 MySQL 和 PostgreSQL 标记了这个,你用的是什么数据库?通过使用正确的 RDBMS 对其进行标记,您的问题可能会受到更适合回答的人的关注。
  • 这个问题没有显示任何研究工作。 做好功课很重要。告诉我们您发现了什么以及为什么它不能满足您的需求。这表明您已经花时间尝试帮助自己,它使我们免于重复明显的答案,最重要的是它可以帮助您获得更具体和相关的答案。 FAQ.
  • 您的表格的结构如何?
  • 也许可以试试union all

标签: mysql sql select


【解决方案1】:

对于 MySQL 试试:

select * from cars where color = 'blue' order by releasedate desc limit 5
Union
select * from cars where color = 'red' order by releasedate desc limit 5

【讨论】:

  • 联合选择是否与两个独立选择一样昂贵?
  • 我认为 UNION ALL 更好。这是之前的一个问题,专门针对联合查询和单独查询之间的性能比较stackoverflow.com/questions/12590596/…
【解决方案2】:

由于 mysql 不支持 CTEWindow Function 像任何其他 RDBMS,您可以在此使用相关子查询,

SELECT  a.*
FROM    Cars a
WHERE   a.Color IN ('Red', 'Blue') AND
        (
            SELECT  COUNT(*)
            FROM    Cars b
            WHERE   b.Color IN ('Red', 'Blue') AND
                    a.Color = b.Color AND
                    a.time >= b.time
        ) <= 5

POSTGRESQL

WITH carList
AS
(
    SELECT  Col1, Col2, Col3, Color,
            ROW_NUMBER() OVER (PARTITION BY Color ORDER BY time DESC) rn
    FROM    tableName
)
SELECT  Col1, Col2, Col3, Color
FROM    carList
WHERE   Color IN ('Red', 'Blue') AND
        RN <= 5

【讨论】:

  • @J W:有趣!如何用 Postgres/Window 解决这个问题?我正在考虑在某个时候切换到 Postgres。
  • @forthrin 查看我更新的答案。 Col1,.., Col3 只是示例列名。呵呵
猜你喜欢
  • 2011-08-04
  • 2014-03-26
  • 1970-01-01
  • 2019-11-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多