![](/img/trans.png)
[英]SQL Query to select records based on 2 different values in the same field and a condition
[英]SQL different SELECT based on condition
我有帶有“分數”列的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
上面的方法不起作用,但希望它能傳達我想要得到的。
我認為這可以滿足您的需求:
(
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
)
試試這個查詢!
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
這個問題很有趣。
當您選擇標簽“ MySQL”時,您可能對我提出的答案沒有直接的興趣,但是總有一天有人會發現它很有用。
我在已經發布的其他兩個答案中看到的問題是,它們使用的不是SQL的“ LIMIT”或“ TOP”。 以下查詢僅使用標准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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.