基本上我想按“標題”排序,同時在該順序中將具有相同的非空“series_id”的電影分組在一起。series_id 為 NULL 的標題應僅按標題排序,而非 NULL series_id 應按“series_order”排序,并根據原始列排序中的“series”.“title”列在結果中。我更愿意在查詢中實作這一點,而不是加載整個資料庫并從那里進行排序。
我嘗試過的(MySQL 5.7.17):
按標題排序,series_id
SELECT * FROM media
ORDER BY title, series_id, series_order
LIMIT 0, 30
不考慮按字母順序不相同的系列中的標題(請參見下面的示例)。
ORDER BY CASE 使用 CONCAT 按 'series'.'title' 'media'.'series_order' 排序
SELECT * FROM media
ORDER BY CASE
WHEN series_id IS NULL THEN title
ELSE CONCAT((SELECT title FROM series WHERE id = media.series_id), series_order)
END
LIMIT 0, 30
結果在 SQL Fiddle 中正確排序,但不在開發服務器上。公平地說,這仍然不是預期的結果,因為 'series'.'title' 可能與原始電影標題不同。
LEFT JOIN 包含用于使用相同想法進行排序的“系列”表
SELECT media.*, series.title, series.id FROM media
LEFT JOIN series ON media.series_id = series.id
LIMIT 0, 30
這也不能正確地對資料進行排序。
樣本資料:
| 標題 | series_id | series_order |
|---|---|---|
| 88分鐘 | 空值 | 空值 |
| 自由地生活或努力地死去 | 100094 | 4 |
| 來自太陽的第三塊巖石 | 100000 | 2 |
| 2把槍 | 空值 | 空值 |
| 死硬死硬的頑固的 | 100094 | 1 |
| 尸變 | 空值 | 空值 |
| 努力死去的好日子 | 100094 | 5 |
| 來自太陽的第三塊巖石 | 100000 | 1 |
| 想要的結果 | 命令 |
|---|---|
| 2把槍 | 空值 |
| 來自太陽的第三塊巖石 | 1 |
| 來自太陽的第三塊巖石 | 2 |
| 88分鐘 | 空值 |
| 死硬死硬的頑固的 | 1 |
| 自由地生活或努力地死去 | 4 |
| 努力死去的好日子 | 5 |
| 尸變 | 空值 |
主表:媒體 相關列:標題,series_id,series_order
系串列:系列 相關列:id、title
小提琴:http : //sqlfiddle.com/#!9/efca7c /3
On the fiddle, option 2 appears to be working. On the dev version it only partially orders things.
EDIT: As it turns out the PHP code I was using to store the data before converting it to JSON was inevitably re-ordering the results by the Primary ID.
uj5u.com熱心網友回復:
根據實作所需排序所需的卷積,如果這是我的應用程式,我可能會創建一個新列,其中包含該系列的“基本標題”并在插入期間填充該值,然后您可以對其進行排序而無需任何巫毒或眼睛疲勞。
在沒有修改您的表結構的情況下,我設法將一個使用ROW_NUMBER()and PARTITION( MySQL8.0 Demo )的解決方案降級為幾個嵌套子查詢——這不是我認為的漂亮。
SQL(演示)
SELECT m2.title grouping_title, m1.title, COALESCE(m2.title, m1.title), m1.series_order
FROM media m1
LEFT JOIN (
SELECT series_id, title
FROM media m3
WHERE series_order = (SELECT MIN(series_order) FROM media WHERE series_id = m3.series_id)
) m2 ON m1.series_id = m2.series_id
ORDER BY COALESCE(m2.title, m1.title), m1.series_order
您可以根據需要修改外部SELECT,但我只想展示COALESCE()函式生成的內容。實際上,我將媒體表加入到自身中,以便我可以獲得series_order給定series_id. 將title在該行中表示排序演算法的第一條規則中使用的“基地稱號” -除非是NULL,在這種情況下,我們只需要使用title從父查詢。
對于您的應用程式輸出,您需要使用m1.title和m1.series_order.
uj5u.com熱心網友回復:
使用CASE運算式檢查seris_order 的值是否為空,如果為空則只取titlw,否則將title 與series_order 連接起來。
詢問
Select case when series_order is null then title else concat(title, ' : Season ', series_order) end as title
From table_name
Order by 1;
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/336833.html
上一篇:簡化專案的if陳述句
下一篇:無法呈現反應組件
