我有带有“得分”列的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
上述方法不起作用,但希望它传达了我想要的东西。
答案 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;