SQL基于条件的不同SELECT

时间:2018-03-21 17:25:12

标签: mysql sql

我有带有“得分”列的SQL表。有时该表将有数百行,有时它将少于10行。我需要一个SQL查询,如果少于10行,则输出前3个分数,如果表中有超过10个分数,则输出前10个分数。

我不确定如何在SQL中执行此操作,但这样的事情:

SELECT
  CASE
    WHEN COUNT(*) < 10 THEN
      (
       SELECT score 
       FROM scores_table 
       ORDER BY score DESC 
       LIMIT 3
      )
    WHEN COUNT(*) > 10 THEN 
      (
       SELECT score 
       FROM scores_table 
       ORDER BY score DESC 
       LIMIT 10
      )
  END

上述方法不起作用,但希望它传达了我想要的东西。

3 个答案:

答案 0 :(得分:3)

我认为这可以满足您的需求:

(
 SELECT `score`
 FROM `scores_table`
 ORDER BY `score` DESC
 LIMIT 3
) 
UNION ALL
(
 SELECT `score`
 FROM `scores_table`
 WHERE (SELECT COUNT(*) FROM `scores_table`) >= 10
 ORDER BY `score` DESC
 LIMIT 2, 7
)

答案 1 :(得分:1)

尝试此查询!

SELECT `score`
 FROM `scores_table`
 WHERE COUNT(*) <= 10
 ORDER BY `score` DESC
 TOP 3

UNION 

SELECT `score`
 FROM `scores_table`
 WHERE COUNT(*) < 10
 ORDER BY `score` DESC
 TOP 10

答案 2 :(得分:1)

这个问题很有意思。

当您选择标记&#34; MySQL&#34;时,您可能不会直接对我建议的答案感兴趣,但有些人可能会发现它有用。

我看到的其他两个答案已经发布的问题是他们使用&#34; LIMIT&#34;或&#34; TOP&#34;,它们不是SQL。以下查询仅使用标准SQL。我们的想法是首先获取第三和第十个分数,然后以高于其中一个的分数获取分数表的每一行。

WITH RN(score, rn) AS (
  SELECT score, row_number() OVER (ORDER BY score DESC)
  FROM score
),
BOUND(bound) AS (
  SELECT min(score)
  FROM RN
  WHERE rn IN (3, 10)
)
SELECT score.*
FROM score
INNER JOIN BOUND ON score >= bound
ORDER BY score DESC;

SQL小提琴:http://sqlfiddle.com/#!17/b44b8/2/0