Maison > Questions et réponses > le corps du texte
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粉3561286762023-09-07 14:33:59
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粉6688042282023-09-07 12:59:57
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.