recherche

Maison  >  Questions et réponses  >  le corps du texte

SQL - Le tri ORDER BY est incorrect

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粉301523298P粉301523298464 Il y a quelques jours568

répondre à tous(2)je répondrai

  • P粉356128676

    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;

    répondre
    0
  • P粉668804228

    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.

    répondre
    0
  • Annulerrépondre