我有一個包含列的測驗表(id、title、language)
id:primary_key(自動遞增)
unique_key(composite) 關于語言和標題
| ID | 標題 | 語言 |
|---|---|---|
| 1 | 日本人 | J.P |
| 2 | 澳大利亞人 | 非盟 |
| 3 | 英語 | CN |
| 4 | 印地語 | 你好 |
我想要一個根據多語言標準回傳 1 行或 0 行的查詢。
查詢應該從左到右回傳語言優先級的結果,如果從左到右沒有找到第一種語言的行,則查找第二種語言,依此類推。
用例:
| 語言 | 結果 row_id | 評論 |
|---|---|---|
| 太平紳士 | 1 | 正如 JP 在 id=1 處發現的 |
| 嗨,JP | 4 | HI 在 id=4 處發現 |
| 俄羅斯、澳大利亞 | 2 | AU 在 id=2 處發現,沒有語言=RU 的行 |
| PK,ST | 沒有行 | 因為沒有任何語言具有價值 PK 或 ST |
這是我嘗試FIELD在語言列上使用子句的自定義順序:
SELECT id, title, language
FROM test WHERE language IN ('TH', 'AU','EN') ORDER BY
FIELD(LANGUAGE,'TH','AU','EN') LIMIT 1;
預期/實際輸出:
| ID | 標題 | 語言 |
|---|---|---|
| 2 | 澳大利亞人 | 非盟 |
我想知道有沒有更好的方法(在性能和可讀性方面)來實作這個用例?
uj5u.com熱心網友回復:
將語言串列轉換為行集:
SELECT test.id, test.title, language
FROM test
JOIN (SELECT 'TH' language, 1 priority UNION ALL
SELECT 'AU' , 2 UNION ALL
SELECT 'EN' , 3 ) languages USING (language)
ORDER BY languages.priority LIMIT 1;
對于 8 ,引數格式將是 csv – 另一個編碼器
WITH RECURSIVE
parameter AS (
SELECT @languages_as_CSV CSV
),
languages AS (
SELECT SUBSTRING_INDEX(CSV, ',', 1) language,
SUBSTRING(CSV FROM 1 LOCATE(',', CSV)) tail,
1 priority
FROM parameter
UNION ALL
SELECT SUBSTRING_INDEX(tail, ',', 1),
SUBSTRING(tail FROM 1 LOCATE(',', tail))
FROM cte
WHERE tail <> ''
)
SELECT test.id, test.title, language
FROM test
JOIN languages USING (language)
ORDER BY languages.priority LIMIT 1;
即遞回 CTE 將 CSV 決議為單獨的值并添加優先級資料。然后執行相同的查詢,并在靜態語言串列中使用已決議的行集。
@languages_as_CS是一個引數的占位符,它在查詢中提供 CSV 語言串列。
注意 - 沒有多余的字符。'TH,AU,EN'而不是'TH, AU, EN'。
uj5u.com熱心網友回復:
看看這是否有幫助:
SELECT ...
WHERE FIND_IN_SET(language, languages)
ORDER BY FIND_IN_SET(language, languages)
如果沒有匹配,FIND_IN_SET 將回傳空集,因此需要額外的東西來處理“0”的情況。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/449617.html
標籤:mysql 加入 sql-order-by 子句 找到第一
上一篇:加入只抓取不匹配的記錄SQL
