2009-08-13 4 views
0

Ich habe zwei Tabellen: Fahrzeuge (Id, VIN) und Bilder (Id, VehicleId, Name, Default). Ich muss die VIN des Fahrzeugs und sein Standardbild auswählen, um es in einer Tabelle anzuzeigen. Das Problem, das ich habe, ist, dass ich, wenn ein Standardbild nicht eingestellt ist, möchte ich noch ein Bild auswählen, um anzuzeigen, wenn es existiert. Wenn keine Bilder vorhanden sind, muss die Fahrzeuginformation natürlich auch noch angezeigt werden. Hier ist, was ich bisher:MySQL komplexe Abfrage liefert keine korrekten Ergebnisse

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 

Diese Aussage Fahrzeuge angezeigt werden, die ein Standardbild, aber nicht etwas angezeigt, wenn kein Standard festgelegt ist.

Um mein Problem besser zu beschreiben hier einige Testdaten:

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 

Obwohl Fahrzeug 2 keine Standard-I hat wollen es ein Bild auszuwählen anzuzeigen. Auch Fahrzeug 3 hat keine Bilder, aber ich brauche es immer noch in der Tabelle ohne Bild. Fahrzeug 1 zeigt sein Standardbild an, weil es eingestellt ist. Ich hoffe, das klärt die Dinge auf.

+1

Sie sollten Ihre alte Frage bearbeitet haben, die zusätzliche Informationen hinzufügen , nicht ein neues erstellen. – Brandon

+0

Ich habe meine Antwort auf Ihre ursprüngliche Frage hinzugefügt, anstatt hier in dieser doppelten Frage zu antworten. –

+0

Ich habe meine Antwort hier zuerst hinzugefügt und habe sie jetzt auch in die andere Frage eingefügt :) –

Antwort

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 

sollte es tun, wie Sie durch die Tatsache Begrenzung wurden, dass standardmäßig auf 1 gesetzt wurde ich denke, das beantwortet Ihre Frage, aber kann für das tatsächliche Ergebnis verfeinert werden müssen Sie wollen- (suchen Sie ? den Namen des Bildes zu erhalten, oder was)

0

OK, hier ist das Setup:

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'); 

Hinweis ich die Spalte DEFAULT-DEF in der IMAGES Tabelle umbenennen musste:

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); 

Und hier ist die Lösung.

Zuerst benötigen wir eine Abfrage, die eine Bildzeile pro Fahrzeug erhält und die Standardreihe auswählt, wenn es eine gibt.

Dazu sortieren wir die Bilder in absteigender Reihenfolge von DEF (so dass die 1en oben liegen) und gruppieren dann durch VEHICLEID, um sicherzustellen, dass es nur eine Zeile pro Fahrzeug gibt.

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 | 
+----+-----------+------+------+ 

Nun wählen wir aus der VEHICLES Tabelle und LEFT OUTER JOIN auf die obige Abfrage sicherstellen, dass wir immer pro Fahrzeug, eine Reihe bekommen:

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

Woher hast du b.VEHICLEID? –

+0

Entschuldigung, das war der Name, den ich benutzte, bevor ich versuchte, es lesbarer zu machen. Jetzt behoben: Es sollte default.images.VHICLEID sein. –