SQL - ORDER BY 排序不正確
P粉301523298
P粉301523298 2023-09-06 18:42:46
0
2
493

我有一個疑問,工作正常。在最後一步中,我希望它根據「項目清單」列中的項目數量對整個表 DESC 進行排序,但它不起作用。

SELECT t8.username AS 'Username',
       GROUP_CONCAT(CASE WHEN t1.dup=1 AND t2.stat=0 AND t5.item_name='lamp' THEN item_id END ORDER BY item_id SEPARATOR ', ') `My Item List`,
       GROUP_CONCAT(CASE WHEN t2.dup=1 AND t1.stat=0 AND t5.item_name='lamp' THEN item_id END ORDER BY item_id SEPARATOR ', ') `Item List`
FROM table1 t1
LEFT JOIN table3 t2 USING (item_id)
JOIN table2 t5 ON t5.id = t2.user_id
JOIN accounts t8 ON t8.id = t2.user_id
WHERE t1.user_id = 23
  AND t2.user_id <> 23
  GROUP BY t2.user_id
  HAVING `Item List` is not null or `My Item List` is not null
  ORDER BY COUNT('Item List') DESC;

我很確定我已經很冷了,但我仍然缺少一些東西。

item_id 以 int(11) 形式儲存在 table2 中,然後將其作為外鍵傳遞給 table3。

這是我透過 COUNT 得到的結果:

這是我得到的長度:

謝謝!

P粉301523298
P粉301523298

全部回覆(2)
P粉356128676

如果您想要按照長度項目清單的結果,則結果如下所示

我的列表項目列表 空 6,7,8,9,10,12,13,14,15,16,17,20,371 空 20,21,22,23,24,25 空 6,7,8,9,10 空 131 空 131 1,4,5 空

嘗試以下查詢

SELECT t8.username AS 'Username',
       GROUP_CONCAT(CASE WHEN t1.dup=1 AND t2.stat=0 AND t5.item_name='lamp' THEN item_id END ORDER BY item_id SEPARATOR ', ') `My Item List`,
       GROUP_CONCAT(CASE WHEN t2.dup=1 AND t1.stat=0 AND t5.item_name='lamp' THEN item_id END ORDER BY item_id SEPARATOR ', ') `Item List`
FROM table1 t1
LEFT JOIN table3 t2 USING (item_id)
JOIN table2 t5 ON t5.id = t2.user_id
JOIN accounts t8 ON t8.id = t2.user_id
WHERE t1.user_id = 23
  AND t2.user_id <> 23
  GROUP BY t2.user_id
  HAVING `Item List` is not null or `My Item List` is not null
  ORDER BY LEN('Item List') DESC;
P粉668804228

我們可以使用與對應的 group_concat 相同的條件的 sum 來計算 Item List 中的元素計數,如下所示:

SELECT t8.username AS 'Username',
    GROUP_CONCAT(CASE WHEN t1.dup=1 AND t2.stat=0 AND t5.item_name='lamp' THEN item_id END ORDER BY item_id SEPARATOR ', ') `My Item List`,
    GROUP_CONCAT(CASE WHEN t2.dup=1 AND t1.stat=0 AND t5.item_name='lamp' THEN item_id END ORDER BY item_id SEPARATOR ', ') `Item List`
FROM table1 t1
...
ORDER BY SUM(CASE WHEN t2.dup=1 AND t1.stat=0 AND t5.item_name='lamp' THEN 1 ELSE 0 END) DESC

這比僅比較產生的字串的長度更安全:例如,包含單一大數字(如'10000')的項目清單仍然比'1 長, 2',其中包含兩項。

如果我們要使用字串函數,我們可以計算字串中出現了多少個逗號:

ORDER BY LENGTH(`Item List`) - LENGTH(REPLACE(`Item List`, ', ', '')) DESC

附註:兩個使用者的清單中可能有相同數量的項目,因此添加另一個排序標準來打破潛在的聯繫可能是個好主意。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!