8
votes

SQL Sélectionnez la ligne où id = max (id)

J'ai une table qui contient des informations sur le produit avec plusieurs instances d'un produit avec le même titre, identifié par différentes couleurs et leurs identifiants. J'ai besoin de sortir la ligne entière où l'ID = l'ID maximum regroupé par le titre, mais je ne peux pas sembler l'obtenir pour le faire. Voici une table très simplifiée et quelques exemples de données: xxx

dans cet exemple avec mon code, je reçois 1 rico rouge blah1 quand je veux 3 rico jaune blah3.

Voici le code que j'utilise: xxx

mise à jour: merci gecs,

J'ai utilisé la réponse d'Alinoz à proposer le code suivant qui fonctionne :) xxx


3 commentaires

Veuillez formater votre requête. C'est illisible.


Le montant maximum (PD_ID) ne fait rien: vous devez tester cela contre quelque chose.


N'utilisez pas la réponse d'Alinoz. Utilisez Adrian ou Salman's (si le ID est la clé principale).


7 Réponses :


3
votes

Essayez d'ajouter une clause supplémentaire à votre endroit où avec pd_id = (Sélectionnez max (pd_id) à partir de ...)

SELECT pd_id, pd_title, pd_description, pd_colour,
       pd_price,pd_large_image,pd_date,cat_sub_id_3,pd_new
FROM product 
WHERE 
  cat_sub_id_1 = '".$cat_sub_id."' 
  AND cat_parent_id='".$cat_parent_id."' 
  AND pd_id = (select max(pd_id) from product)
GROUP BY pd_title


1 commentaires

Ne fonctionnera pas. Vous choisiriez une seule pièce d'identité max dans la sous-requête, qui s'applique à un seul groupe de produits, ce qui rend le reste de la clause où la clause exclure tous les autres produits, à l'exception de celui dont l'identifiant est le plus élevé dans toute la table.



8
votes

Je pense que cela pourrait fonctionner (non testé):

SELECT * FROM that_table WHERE id IN (
SELECT MAX(id) FROM that_table GROUP BY title
) /* AND this = that */


0 commentaires

0
votes

Étant donné que vous commandez déjà, vous pouvez utiliser la ligne numéro = 1 dans la condition. Voir cette lien . Et puisque votre dB n'est pas connu. Je ne peux pas donner une requête spécifique mais vous diriger dans la direction

ou essayer Top SQL qui donnera le même résultat, comme commander est utilisé


0 commentaires

21
votes

aaahhh, le bon vieux ... xxx

Bien sûr, vous devez l'adapter à vos besoins en conséquence.

aussi , Je pense que c'est un "must lis": SQL Sélectionner uniquement des lignes avec une valeur max sur une colonne


2 commentaires

@ypercube merci. La chose est la suivante: cela est posé si souvent (et je réponds si souvent!) Que j'ai décidé d'avoir une de mes réponses et de ré-écrivez-la comme une réponse globale sur le sujet, pour aider les autres à l'avenir.


C'est une excellente réponse. N'hésitez pas à ajouter l'approche (comme dans ma réponse ici) qui produit des résultats (légèrement) différents quand il y a des liens, par exemple. 2 lignes ou plus avec ID maximum.



2
votes

Outre l'approche de Adrian et Salman, il y a une partie qui donne des résultats différents quand il y a des liens, deux lignes ou plus avec le même identifiant (maximum). Il ne montrera qu'une seule ligne par titre, tandis que l'autre requête vous montrera toutes (dans votre cas qui est probablement sans importance que vous commandez par ID, que je suppose est la clé principale):

SELECT 
    t.* 
FROM 
    TableX AS t
  JOIN
    ( SELECT DISTINCT
          title                        --- what you want to Group By
      FROM TableX 
    ) AS dt
    ON t.PK =                          --- the Primary Key of the table
       ( SELECT tt.PK
         FROM TableX AS tt
         WHERE tt.title = dt.title
         ORDER BY id ASC               --- (or DESC) what you want to Order By
         LIMIT 1
       )


6 commentaires

+1 Très intéressant ... Ceci sélectionne uniquement une valeur maximale par identifiant de groupe dans le cas d'une "cravate", souhaitable, en fonction des spécifications.


Crédits à Quassnoi: Stackoverflow.com/Questtions/1201296/...


et: Stackoverflow.com/Questtions/7233757/order- dans le groupe par / ...


Juste une chose: apparemment, toutes les versions de MySQL n'acceptent pas la limite de sous-requêtes dev.mysql.com/doc/refman/5.0/fr/subquerery-Errors.html Toutefois, l'approche fonctionnera pour d'autres dB premiers n.


MySQL accepte = (SELECT ... LIMITE 1) (pas sûr de la version et ci-dessus). Il n'accepte pas dans (SELECT ... LIMITNE X) ou > TOUT (SELECT ... LIMIT X)


Je vois, intéressant en effet. Je parle couramment MySQL, pas non pas "Nativement fluide" :)



7
votes

Tout simplement pour une ligne par n'importe quel (dans ce cas 'ID') valeur max xxx


0 commentaires

0
votes

Je pense que ce n'est pas nécessaire d'utiliser des sous-éléments: xxx

c'est juste un exemple rapide de mes tests. Juste par shure pour commander de la même manière dans le substrant_indexes et utilisez un bon séparateur.

amusez-vous


0 commentaires