Je dois prendre la dernière valeur de la table où can_id est égal.
J'ai donc essayé cette requête SQL

SELECT com.text, com.can_id 
FROM (SELECT * FROM comments ORDER BY id DESC) as com 
GROUP BY com.can_id

Mais si je change ASC / DESC dans le premier select, le second select regroupera simplement sans trier et prendra la valeur avec le premier id
Cette sélection sera utilisée comme jointure gauche dans la requête.

Exemple:
entrez la description de l'image ici

J'ai besoin d'obtenir com.text avec la valeur "text2" (dure)

0
Alexander Yashchyshen 27 janv. 2019 à 15:37

3 réponses

Meilleure réponse

Dans n'importe quelle version de MySQL, ce qui suit fonctionnera:

SELECT c.*
FROM comments c
WHERE c.id = (SELECT MAX(c2.id)
              FROM comments c2
              WHERE c2.can_id = c.can_id
             );

Avec un index sur comments(can_id, id), cela devrait également avoir les meilleures performances.

C'est mieux qu'une approche group by car elle peut utiliser un index et n'est pas limitée par une limitation interne sur les longueurs de chaîne intermédiaires.

Cela devrait avoir de meilleures performances que row_number() car il n'attribue pas de numéro de ligne à chaque ligne, uniquement pour filtrer les éléments.

0
Gordon Linoff 1 févr. 2019 à 11:38

La clause order by de la sélection interne est redondante car elle est utilisée comme table et les tables d'une base de données relationnelle ne sont pas ordonnées par nature.
Alors que d'autres bases de données telles que SQL Server traiteront cela comme une erreur, je suppose que MySql l'ignore tout simplement.

Je pense que vous cherchez quelque chose comme ça:

SELECT text, can_id
FROM comments
ORDER BY id DESC
LIMIT 1

De cette façon, vous obtenez le texte et can_id associés à la valeur d'id la plus élevée.

0
Zohar Peled 27 janv. 2019 à 12:46

Si vous utilisez MySql 8, vous pouvez utiliser row_number:

SELECT com.text, com.can_id 
FROM (SELECT comments.*,
             row_number() over (partition by can_id order by id desc) rn
      FROM   comments) as com 
WHERE rn = 1;

Si vous êtes sur MySql 5.6+, vous pouvez (ab) utiliser group_concat:

SELECT SUBSTRING_INDEX(group_concat(text order by id desc), ',', 1), 
       can_id 
FROM   comments 
GROUP BY can_id;
1
trincot 27 janv. 2019 à 12:58