SQL - Le tri ORDER BY est incorrect
P粉301523298
P粉301523298 2023-09-06 18:42:46
0
2
575

J'ai une question, ça marche bien. Dans la dernière étape, je souhaite qu'il trie toute la table DESC en fonction du nombre d'éléments dans la colonne "Liste d'éléments", mais cela ne fonctionne pas.

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;

Je suis presque sûr d'avoir déjà froid, mais il me manque encore quelque chose.

item_id est stocké dans la table2 sous le nom int(11), puis transmis comme clé étrangère à la table3.

Voici le résultat que j'obtiens via COUNT :

Voici la longueur que j'ai obtenue :

Merci !

P粉301523298
P粉301523298

répondre à tous(2)
P粉356128676

Si vous souhaitez le résultat de la liste des éléments par longueur, le résultat ressemble à ci-dessous

Ma liste d'éléments de liste Vide 6,7,8,9,10,12,13,14,15,16,17,20,371 Vide 20,21,22,23,24,25 Vide 6,7,8,9,10 Vide 131 Vide 131 1,4,5 vide

Essayez la requête suivante

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

Nous pouvons utiliser le nombre d'éléments dans le group_concat 相同的条件的 sum 来计算 Item List correspondant comme suit :

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

C'est plus sûr que de simplement comparer la longueur des chaînes résultantes : par exemple, contenant un seul grand nombre comme '10000')的项目列表仍然比 '1 长, 2' qui contient deux éléments

.

Si nous devions utiliser des fonctions de chaîne, nous pourrions compter le nombre de virgules apparaissant dans une chaîne :

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

Remarque : deux utilisateurs peuvent avoir le même nombre d'éléments dans leurs listes, cela pourrait donc être une bonne idée d'ajouter un autre critère de tri pour briser l'égalité potentielle.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal