我正在從資料庫回傳一個結果串列,但由于設計功能,我需要一個特定的順序。
結果應該隨機回傳。唯一的標準是其中一個值不應連續出現兩次。
這是示例資料:
| ID | 動物 | 顏色 |
|---|---|---|
| 1 | 倉鼠 | 棕色的 |
| 2 | 狗 | 棕色的 |
| 3 | 馬 | 白色的 |
| 4 | 老鼠 | 灰色的 |
| 5 | 貓 | 黑色的 |
| 6 | 鳥 | 橘子 |
| 7 | 蛇 | 綠色 |
| 8 | 猴 | 橘子 |
| 9 | 變色龍 | 綠色 |
所以我在表中有一個串列animals和他們的個人colours。我想回傳一個隨機排序的 5 只動物的串列,但沒有兩個colours連續出現。所以狗不能出現在老鼠之后,變色龍不能出現在蛇之后……
我過去用 PHP 解決了這個問題。但我正在尋找一個更快、更智能的解決方案,希望只在 MySQL 中。
讓我知道 :-)
uj5u.com熱心網友回復:
好吧,如果你使用的是最新版本的 MySQL (8.0 ),你可以這樣做。
第一個 CTE 術語提供資料。您可以將其替換為您希望的任何資料串列,直接來自某個表或復雜查詢運算式的結果。
rn0 是隨機排序的資料的順序。
@Zakaria 是正確的。這是調整后的 SQL,用于處理隨機排序資料后連續行不應具有相同顏色的要求。
基本上,這對資料進行隨機排序,然后只取每個顏色島的第一條邊,并將結果限制為 5 個島。
WITH data (id,animals,color) AS (
SELECT 1 AS id, 'hamster' AS animals , 'brown' AS color UNION
SELECT 2, 'dog' , 'brown' UNION
SELECT 3, 'horse' , 'white' UNION
SELECT 4, 'mouse' , 'gray' UNION
SELECT 5, 'cat' , 'black' UNION
SELECT 6, 'bird' , 'orange' UNION
SELECT 7, 'snake' , 'green' UNION
SELECT 8, 'monkey' , 'orange' UNION
SELECT 9, 'chameleon' , 'green'
)
, list1 AS (
SELECT id, animals, color, ROW_NUMBER() OVER (ORDER BY rand()) AS rn0 FROM data
)
, list AS (
SELECT *, CASE WHEN color = LAG(color) OVER (ORDER BY rn0) THEN 0 ELSE 1 END AS good
FROM list1
)
SELECT *
FROM list
WHERE good = 1
ORDER BY rn0
LIMIT 5
;
一個示例結果:
---- ----------- -------- ----- ------
| id | animals | color | rn0 | good |
---- ----------- -------- ----- ------
| 9 | chameleon | green | 1 | 1 |
| 2 | dog | brown | 3 | 1 |
| 6 | bird | orange | 4 | 1 |
| 1 | hamster | brown | 5 | 1 |
| 3 | horse | white | 6 | 1 |
---- ----------- -------- ----- ------
原始 SQL 的功能超出了要求,需要在結果中使用不同的顏色。這不是所要求的。
WITH data (id,animals,color) AS (
SELECT 1, 'hamster' , 'brown' UNION
SELECT 2, 'dog' , 'brown' UNION
SELECT 3, 'horse' , 'white' UNION
SELECT 4, 'mouse' , 'gray' UNION
SELECT 5, 'cat' , 'black' UNION
SELECT 6, 'bird' , 'orange' UNION
SELECT 7, 'snake' , 'green' UNION
SELECT 8, 'monkey' , 'orange' UNION
SELECT 9, 'chameleon' , 'green'
)
, list AS (
SELECT *, ROW_NUMBER() OVER (ORDER BY rand()) AS rn0 FROM data
)
, step1 AS (
SELECT list.*, ROW_NUMBER() OVER (PARTITION BY color ORDER BY rn0) AS rn
FROM list
)
SELECT *
FROM step1
WHERE rn = 1
ORDER BY rn0
LIMIT 5
;
樣本結果:
---- --------- -------- ----- ----
| id | animals | color | rn0 | rn |
---- --------- -------- ----- ----
| 7 | snake | green | 1 | 1 |
| 6 | bird | orange | 2 | 1 |
| 3 | horse | white | 3 | 1 |
| 1 | hamster | brown | 5 | 1 |
| 5 | cat | black | 6 | 1 |
---- --------- -------- ----- ----
uj5u.com熱心網友回復:
你的意思是這樣的嗎?
select any_value(name), color from animals group by color order by rand() limit 5;
在這里小提琴:https ://dbfiddle.uk/ ? rdbms = mysql_5.7 & fiddle = ff1854c9698e2c60deaf9131ea87774c
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/407537.html
標籤:
下一篇:java-如何避免在Java中將資料存盤在mysqldb中的注冊文本欄位中輸入空白?如何避免不填寫用戶名和密碼就登錄?
