Rumah  >  Soal Jawab  >  teks badan

SQL - ORDER BY sorting tidak betul

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粉301523298P粉301523298410 hari yang lalu511

membalas semua(2)saya akan balas

  • P粉356128676

    P粉3561286762023-09-07 14:33:59

    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;

    balas
    0
  • P粉668804228

    P粉6688042282023-09-07 12:59:57

    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.

    balas
    0
  • Batalbalas