En utilisant les tableaux ci-dessous comme exemple et la requête listée comme requête de base, je souhaite ajouter un moyen de sélectionner uniquement les lignes avec un identifiant maximum! Sans avoir à faire une seconde requête!MySQL sélectionnant des lignes avec un identifiant maximum et correspondant à d'autres conditions
TABLE VEHICLES
id vehicleName
----- --------
1 cool car
2 cool car
3 cool bus
4 cool bus
5 cool bus
6 car
7 truck
8 motorcycle
9 scooter
10 scooter
11 bus
TABLE VEHICLE NAMES
nameId vehicleName
------ -------
1 cool car
2 cool bus
3 car
4 truck
5 motorcycle
6 scooter
7 bus
TABLE VEHICLE ATTRIBUTES
nameId attribute
------ ---------
1 FAST
1 SMALL
1 SHINY
2 BIG
2 SLOW
3 EXPENSIVE
4 SHINY
5 FAST
5 SMALL
6 SHINY
6 SMALL
7 SMALL
Et la requête de base:
select a.*
from vehicle a
join vehicle_names b using(vehicleName)
join vehicle_attribs c using(nameId)
where c.attribute in('SMALL', 'SHINY')
and a.vehicleName like '%coo%'
group
by a.id
having count(distinct c.attribute) = 2;
donc ce que je veux atteindre est de sélectionner des lignes avec certains attributs, qui correspondent à un nom mais une seule entrée pour chaque nom qui correspond où l'identification est le plus haut!
Ainsi, une solution de travail dans cet exemple renverrait les lignes ci-dessous:
id vehicleName
----- --------
2 cool car
10 scooter
si elle utilisait une sorte de max sur l'ID
au moment où je reçois toutes les entrées pour voiture cool et scooter.
Ma base de données du monde réel suit une structure similaire et a des dizaines de milliers d'entrées, de sorte qu'une requête comme ci-dessus pourrait facilement renvoyer plus de 3000 résultats. Je limite les résultats à 100 lignes pour maintenir le temps d'exécution bas car les résultats sont utilisés dans une recherche sur mon site. La raison pour laquelle je répète des "véhicules" avec le même nom mais seulement un ID différent est que de nouveaux modèles sont constamment ajoutés mais je garde le plus vieux pour ceux qui veulent les déterrer! Mais sur une recherche par nom de voiture, je ne veux pas retourner les cartes les plus anciennes juste la plus récente qui est celle avec le plus haut ID!
La réponse correcte permettrait d'adapter la requête que j'ai fournie ci-dessus que je suis en train d'utiliser et de ne lui renvoyer que des lignes où le nom correspond mais a l'ID le plus élevé!
Si cela n'est pas possible, des suggestions sur la façon dont je peux réaliser ce que je veux sans augmenter massivement le temps d'exécution d'une recherche seraient appréciées!
Avez-vous des index sur '' vehicle_attribs' sur (nameId, attribut) '? Et la recherche sur vehicle_names en utilisant 'LIKE '% cool%'' N'utilise PAS d'index – ajreal
@ajreal il y a une PRIMARY KEY sur (nameId, attribut) dans le vehicle_attribs. – Tristan