SQL - ORDER BY sorting tidak betul
P粉301523298
P粉301523298 2023-09-06 18:42:46
0
2
542

Saya ada soalan, ia berfungsi dengan baik. Dalam langkah terakhir, saya mahu ia mengisih keseluruhan jadual DESC berdasarkan bilangan item dalam lajur "Senarai Item", tetapi ia tidak berfungsi.

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;

Saya pasti saya sudah sejuk, tetapi saya masih kehilangan sesuatu.

item_id disimpan dalam table2 sebagai int(11) dan kemudian dihantar sebagai kunci asing ke table3.

Ini adalah hasil yang saya dapat melalui COUNT:

Ini adalah panjang yang saya dapat:

Terima kasih!

P粉301523298
P粉301523298

membalas semua(2)
P粉356128676

Jika anda mahu hasil senarai item mengikut panjang, hasilnya kelihatan seperti di bawah

Senarai Item Senarai Saya Kosong 6,7,8,9,10,12,13,14,15,16,17,20,371 Kosong 20,21,22,23,24,25 Kosong 6,7,8,9,10 Kosong 131 Kosong 131 1,4,5 kosong

Cuba pertanyaan berikut

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

Kita boleh menggunakan kiraan unsur dalam group_concat 相同的条件的 sum 来计算 Item List yang sepadan seperti berikut:

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

Ini lebih selamat daripada hanya membandingkan panjang rentetan yang terhasil: contohnya, mengandungi satu nombor besar seperti '10000')的项目列表仍然比 '1 长, 2' yang mengandungi dua item

Jika kita menggunakan fungsi rentetan, kita boleh mengira bilangan koma yang muncul dalam rentetan:

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

Nota sampingan: Dua pengguna mungkin mempunyai bilangan item yang sama dalam senarai mereka, jadi mungkin idea yang baik untuk menambah satu lagi kriteria pengisihan untuk memecahkan potensi seri.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan