2016-06-22 12 views
2

Im folgenden MySQL Codesegment verwende ich zwei eingebettete SELECT Anweisungen innerhalb einer einzigen SELECT Anweisung, um einige Informationen aus meiner Datenbank zurückzugeben. Es funktioniert derzeit korrekt, aber ich bin mir nicht sicher, ob die beiden eingebetteten SELECT Anweisungen korrekt verwendet werden.Gibt es eine bessere Möglichkeit, die eingebettete SELECT-Anweisung innerhalb dieser SELECT-Anweisung zu strukturieren?

SELECT 
    E.ID AS DEBATE_GROUPS_ID, 
    A.TITLE AS STARTER_PACK_TITLE, 
    B.TITLE AS UNITS_TITLE, 
    B.UNIT_CODE AS UNITS_CODE, 
    (SELECT FIRST_NAME FROM USERS WHERE ID = A.ACADEMIC_ID) AS ACADEMIC_FIRSTNAME, 
    (SELECT LAST_NAME FROM USERS WHERE ID = A.ACADEMIC_ID) AS ACADEMIC_LASTNAME, 
    D.DATE_DUE AS DEBATES_DUE_DATE 
FROM 
    STARTER_PACKS A, 
    UNITS B, 
    USERS C, 
    DEBATES D, 
    DEBATE_GROUPS E 
WHERE 
    D.ID = E.DEBATE_ID AND E.STUDENT_ID = C.ID AND C.ID = 12 

Daher ist meine Frage ...

Ist das, was ich mit den eingebetteten SELECT Aussagen richtig mache, oder gibt es eine bessere Alternative in Bezug auf die Effizienz oder die Lesbarkeit zu verbessern?

Antwort

3

Ja, mit einer JOIN, obwohl Ihre Abfrage scheint total falsch, Sie haben fast keine Join-Bedingungen!

SELECT 
    E.ID AS DEBATE_GROUPS_ID, 
    A.TITLE AS STARTER_PACK_TITLE, 
    B.TITLE AS UNITS_TITLE, 
    B.UNIT_CODE AS UNITS_CODE, 
    C.FIRSTNAME AS ACADEMIC_FIRSTNAME, 
    C.LASTNAME AS ACADEMIC_LASTNAME, 
    D.DATE_DUE AS DEBATES_DUE_DATE 
FROM 
    STARTER_PACKS A 
    INNER JOIN UNITS B ON(a.Column = B.Column) 
    INNER JOIN USERS C ON(C.ID = A.ACADEMIC_ID) 
    INNER JOIN DEBATES D ON (SomeColumn = D.Column) 
    INNER JOIN DEBATE_GROUPS E ON(D.ID = E.DEBATE_ID AND E.STUDENT_ID = C.ID) 
WHERE 
    C.ID = 12 

Verwenden Sie bitte die korrekte Syntax eines expliziten Joins, dies wird Ihnen helfen, diese Art von Problemen zu vermeiden. Ersetzen Sie diese Zeilen mit den tatsächlichen Spalten Beziehungen:

INNER JOIN UNITS B ON(a.Column = B.Column) 
    INNER JOIN DEBATES D ON (SomeColumn = D.Column) 
0

es nicht ganz klar ist, was das Ziel dieser Abfrage ist, aber für das, was ich sehen kann, können Sie ersetzen

(SELECT FIRST_NAME FROM USERS WHERE ID = A.ACADEMIC_ID) AS ACADEMIC_FIRSTNAME 

with C.FIRST_NAME AS ACADEMIC_FIRSTNAME 

and 

(SELECT LAST_NAME FROM USERS WHERE ID = A.ACADEMIC_ID) AS ACADEMIC_LASTNAME 

with C.LAST_NAME AS ACADEMIC_LASTNAME 

add also a where clause to join USERS and STARTER_PACKS tables `AND C.ID = A.ACADEMIC_ID 

Hoffe, es hilft. Simone

Verwandte Themen