2009-08-13 7 views
0

J'ai deux tables: Véhicules (ID, VIN) et Images (Id, VehicleId, Nom, Default). Je dois sélectionner le véhicule VIN et son image par défaut à afficher dans un tableau. Le problème que j'ai est que si une image par défaut n'est pas définie, je voudrais toujours sélectionner une image à afficher si elle existe. Si aucune image n'existe, les informations sur le véhicule doivent également toujours être affichées. Voici ce que j'ai jusqu'à présent:La requête complexe MySQL ne donne pas de bons résultats

SELECT 
    Vehicles.Id, Vehicles.VIN, Images.Name AS Image, 
    (SELECT COUNT(*) FROM Images WHERE VehicleId = Vehicles.Id) AS ImageCount 
FROM 
    Vehicles 
LEFT JOIN 
    Images ON Images.VehicleId = Vehicles.Id 
WHERE 
    Images.Default = 1 

Cette déclaration affiche les véhicules qui ont une image par défaut mais n'affichera rien si aucune valeur par défaut est.

Pour décrire mon problème mieux est ici quelques données de test:

VEHICLES: 
ID VIN 
1 12341234123412341 
2 23452345234523452 
3 34534534534534534 

IMAGES: 
ID VEHICLEID NAME DEFAULT 
1 1   a 1 
2 1   b 0 
3 2   c 0 
4 2   d 0 

Même si un véhicule 2 n'a pas défaut, je veux pour sélectionner une image à afficher. De plus, le véhicule 3 n'a pas d'images du tout mais j'en ai encore besoin pour apparaître dans le tableau sans image. Le véhicule 1 affichera son image par défaut parce qu'elle est définie. J'espère que cela clarifie les choses.

+1

Vous devriez avoir modifié votre vieille question d'ajouter des informations supplémentaires , n'en crée pas un nouveau. – Brandon

+0

J'ai ajouté à ma réponse à votre question initiale, au lieu de répondre ici à cette question en double. –

+0

J'ai ajouté ma réponse ici en premier, et l'ai maintenant collé dans l'autre question aussi :) –

Répondre

0
SELECT 
    Vehicles.Id, Vehicles.VIN, Images.Name AS Image, 
    (SELECT COUNT(*) FROM Images WHERE VehicleId = Vehicles.Id) AS ImageCount 
FROM 
    Vehicles 
LEFT JOIN 
    Images ON Images.VehicleId = Vehicles.Id 
WHERE 
    1 

devrait faire l'affaire, comme vous limitions par le fait que le défaut a été fixé à 1. Je pense que cela répond à votre question, mais peut-être besoin d'affiner le résultat réel que vous veux- (vous cherchez ? pour obtenir le nom de l'image, ou quoi)

0

OK, voici la configuration:

mysql> create table VEHICLES (ID INT PRIMARY KEY, VIN CHAR(17)); 
mysql> INSERT INTO VEHICLES (ID, VIN) VALUES(1, '12341234123412341'); 
mysql> INSERT INTO VEHICLES (ID, VIN) VALUES(2, '23452345234523452'); 
mysql> INSERT INTO VEHICLES (ID, VIN) VALUES(3, '34534534534534534'); 

Remarque je devais renommer la colonne DEFAULT-DEF dans la table iMAGES:

mysql> CREATE TABLE IMAGES (ID INT PRIMARY KEY, VEHICLEID INT, NAME VARCHAR(20), DEF INT); 
mysql> INSERT INTO IMAGES(ID, VEHICLEID, NAME, DEF) VALUES(1, 1, 'a', 1); 
mysql> INSERT INTO IMAGES(ID, VEHICLEID, NAME, DEF) VALUES(2, 1, 'b', 0); 
mysql> INSERT INTO IMAGES(ID, VEHICLEID, NAME, DEF) VALUES(3, 2, 'c', 0); 
mysql> INSERT INTO IMAGES(ID, VEHICLEID, NAME, DEF) VALUES(4, 2, 'd', 0); 

Et voici la solution.

D'abord, nous avons besoin d'une requête qui obtient une rangée d'image par véhicule, en choisissant celle par défaut s'il y en a une. Nous faisons cela en triant les images dans l'ordre décroissant de DEF (de sorte que les 1 sont en haut), puis en regroupant par VEHICLEID pour nous assurer qu'il n'y a qu'une seule ligne par véhicule.

mysql> SELECT * FROM (SELECT * FROM IMAGES ORDER BY DEF DESC) sortedimages GROUP BY VEHICLEID; 
+----+-----------+------+------+ 
| ID | VEHICLEID | NAME | DEF | 
+----+-----------+------+------+ 
| 1 |   1 | a | 1 | 
| 3 |   2 | c | 0 | 
+----+-----------+------+------+ 

Maintenant, nous sélectionnons de la table VEHICLES et LEFT OUTER JOIN à la requête ci-dessus pour nous assurer d'avoir toujours une ligne par véhicule:

mysql> SELECT * FROM VEHICLES LEFT OUTER JOIN (SELECT * FROM (SELECT * FROM IMAGES ORDER BY DEF DESC) sortedimages GROUP BY VEHICLEID) defaultimages ON VEHICLES.ID = defaultimages.VEHICLEID; 
+----+-------------------+------+-----------+------+------+ 
| ID | VIN    | ID | VEHICLEID | NAME | DEF | 
+----+-------------------+------+-----------+------+------+ 
| 1 | 12341234123412341 | 1 |   1 | a | 1 | 
| 2 | 23452345234523452 | 3 |   2 | c | 0 | 
| 3 | 34534534534534534 | NULL |  NULL | NULL | NULL | 
+----+-------------------+------+-----------+------+------+ 
+0

Où avez-vous obtenu b.VEHICLEID? –

+0

Désolé, c'était le nom que j'utilisais avant d'essayer de le rendre plus lisible. Fixé maintenant: il aurait dû être defaultimages.VEHICLEID. –

Questions connexes