2016-06-22 3 views
2

MySQLコードセグメントでは、SELECTという2つの埋め込みステートメントを1つのSELECTステートメント内に埋め込んで使用しています。現在正しく動作していますが、2つの埋め込みSELECTステートメントが正しく利用されているかどうかはわかりません。このSELECTステートメント内に埋め込みSELECTステートメントを構造化するより良い方法はありますか?

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 

したがって、私の質問は...

は正しい、私が埋め込まSELECT文でやっているですか効率や可読性の向上の面でより良い代替手段はありますか?

答えて

3

はい、JOINの場合、クエリは完全に間違っているようですが、ほとんどの場合、参加条件はありません。

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 

明示的な結合の正しい構文を使用してください。これは、このタイプの問題を回避するのに役立ちます。実際の列の関係でこれらの行を置き換えます

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

このクエリの目的が何であるかを完全に明らかではないが、私は何を見ることができるため、あなたは

(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 

はそれが役に立てば幸い置き換えることができます。 Simone

関連する問題