La sélection de max() de plusieurs colonnes
Ok, voici ma table:
product_id version_id update_id patch_id
1 1 0 0
1 1 1 0
1 1 1 1
1 1 2 0
1 1 2 1
2 1 0 0
2 2 0 0
2 3 0 0
2 3 0 1
3 1 0 0
3 1 0 1
Maintenant, je veux sélectionner la dernière version d'un produit, de sorte que la version avec le plus haut update_id & patch_id.
Par exemple, la dernière version de
- produit 1 doit retourner 1, 2, 1
- produit de 2 et de 3, 0, 1
- produit 3 doit retourner 1, 0, 1
J'ai essayé toutes sortes de choses avec GROUP BY et HAVING, essayé des sous-requêtes, mais je n'ai pas encore trouver un moyen pour accomplir cette tâche.
Quelqu'un peut-il m'aider à trouver la bonne requête, ou devrais-je penser à écrire une fonction php pour cela?
Modifier
Quelques informations supplémentaires:
- Les colonnes sont la clé primaire (il y a plus de colonnes, mais pour ce problème, ils n'ont pas d'importance)
- Aucun des colonnes est en auto-increment
C'est la table:
CREATE TABLE IF NOT EXISTS `db`.`patch` (
`product_id` INT NOT NULL ,
`version_id` INT NOT NULL ,
`update_id` INT NOT NULL ,
`patch_id` INT NOT NULL
PRIMARY KEY (`product_id`, `version_id`, `update_id`, `patch_id`) ,
INDEX `fk_patch_update1` (`product_id` ASC, `version_id` ASC, `update_id` ASC) )
Edit 2
Marqué comme en double, il n'est pas: L'autre question pour les enregistrements supérieur à une valeur pour l'une des trois colonnes différentes.
Dans cette question, nous recherchons pour le plus grand numéro de version regroupés par le product_id.
Modifier 3
rgz réponse me dit encore que c'est un doublon. Tout d'abord: cette question est plus. Deuxièmement, je ne pense pas que la réponse est la même.
rgz suggère d'utiliser la requête suivante:
SELECT product_id, GREATEST(version_id, update_id, patch_id) AS latest_version FROM patch.
PLUS grand(1,2,3) renvoie 3, à droite? Wat si nous avons ces valeurs:
product_id version_id update_id patch_id
1 1 0 0
1 1 2 8
1 3 0 0
Que je comprends, cette requête sera de retour:
product_id latest_version
1 1
1 8
1 3
Mais il doit retourner:
product_id version_id update_id patch_id
1 3 0 0
Je ne pense pas que le PLUS susceptible de l'aider. Si vous pensez qu'il va, merci de me prouver le contraire.
- Je sais que c'est une vieille question, mais vous pouvez aussi faire ceci: SELECT * from db.patch COMMANDE PAR UPDATE_ID DESC, PATCH_ID DESC LIMIT 1;
- Double Possible de Mysql valeur max à partir de 3 colonnes
- Ce n'est pas un doublon. Voir mon edit.
- Pour clarifier, est la condition pour que le retour lignes doivent être de la plus haute patch_id de la plus haute update_id de la plus haute version_id de chaque product_id?
- Oui, c'est la condition.
Vous devez vous connecter pour publier un commentaire.
C'est un exemple de cas unique identificateurs venir dans utile.
Imaginez que vous avez un autoincrememnting champ ID, vous pouvez trouver l'id que vous souhaitez pour chaque produit, en utilisant une sous-requête corrélée...
L'équivalent sans un unique identifiant nécessite plusieurs corrélation des sous-requêtes...
Ce serait nettement plus lent que sur une table avec un identifiant unique colonne.
Une autre solution (sans identifiant unique) est de l'auto-jointure sur les différents niveaux d'agrégation.
patch_id
btw (ce n'est pas un assez grand changement qui DONC va me permettre de modifier)Essayer:
Excusez-moi, c'est @RolandoMySQLDBA. Pardonner à l'intrusion, mais je suis de l'affichage de votre requête et de sa sortie à l'encontre de l'échantillon de données:
Votre requête fonctionne comme indiqué. Il est aussi plus simple à mon avis. Bon Spectacle !!!
Je n'ai pas tester, mais je suis sûr que vous pouvez faire quelque chose comme ceci
Excusez-moi, c'est @RolandoMySQLDBA. Pardonner à l'intrusion, mais je suis de l'affichage de votre requête et de sa sortie à l'encontre de l'échantillon de données:
Bien que l'affichage est différent, votre requête logiquement travaille pour la question d'origine. +1 de moi !!!
Vous pourriez groupe par
max(update_id * maxpatchidvalue + patch_id)
pour obtenir ce que vous voulez.À l'aide de vos données d'entrée à partir de la question, et une table avec des pas de touches, ici, est plutôt malade approche qui fonctionne:
Tout d'abord, la requête que vous avez besoin est: est-ce
Voici un exemple de code à l'aide de tous les nombres entiers, pas d'index, et votre exemple de données:
Voici le résultat:
Lui donner un essai !!!
Mise en garde
Ma réponse sera un soutien par produit
version_id*10000+update_id*100+patch_id
. @fge utiliseupdate_id * maxpatchidvalue + patch_id
De l'essayer.
MySQL a la
GREATEST
fonction de sorte que vous devriez l'utiliser comme ceci:J'ai marqué cette question comme un doublon, car les deux questions sont fondamentalement demander la même chose, la sélection de la valeur maximale de plusieurs colonnes. Ici, vous l'utiliser dans la clause SELECT, dans l'autre la question de l'utiliser dans la clause where. Dans les deux cas, PLUS grand est le tour est joué.