2

3 つのリンクされたテーブルに対して MySQL で実行する必要があるクエリがあります。ネストされたクエリを使用して怠惰な方法で実行できますが、単一のクエリで実行する方法がわかりません。

テーブルは次のとおりです。

Area:-
 : id     (int)
 : name   (string)

Consultant:-
 :id      (int)
 :active  (1/0)

ConsArea:-
 : areaID        (int)
 : consultantID  (int)

すべてのエリアを (変数を使用して) ループ処理して、すべてのエリア$areaをリストし、各エリアに対して「アクティブな」コンサルタントの数を示す必要があります。アクティブなコンサルタントが関連付けられていない場合はゼロ)

クエリの最初の部分 (コンサルタントがアクティブであるかどうかに関係なく) で実行できます。

      SELECT areas.name AS aname, COUNT(consAreas.areaID) AS cct 
        FROM areas LEFT OUTER JOIN consAreas 
          ON consAreas.areaID = areas.id 
       WHERE areas.areaID = $area 
    GROUP BY areas.id 
    ORDER BY areas.name

..しかし、コンサルタントがアクティブであるという条件を含めたい場合、正しい結合を行うことができません。アクティブなコンサルタントが 0 人を超える領域のみがリストされますが、すべての領域が必要です。

      SELECT areas.name AS aname, COUNT(consAreas.area) AS cct 
        FROM areas LEFT OUTER JOIN consAreas 
          ON consAreas.area = areas.id 
        **JOIN consultants ON consultants.id = consAreas.cons**
       WHERE areas.areaID = $area 
         **AND consultants.active = 1**
    GROUP BY areas.id 
    ORDER BY areas.name

誰か助けて?

4

4 に答える 4

11

これは、mysql の動作によるものです。左結合に続く内部結合は、その左結合を内部結合にします。

SELECT areas.name AS aname, COUNT(consultants.id) AS cct 
FROM areas
    LEFT JOIN consAreas ON consAreas.area = areas.id 
    LEFT JOIN consultants ON consultants.id = consAreas.cons AND consultants.active = 1
WHERE 
    areas.areaID = $area 
GROUP BY areas.id 
ORDER BY areas.name

ここでは、左結合のみを使用しており、さらに重要なことにconsultants.active、左結合の ON 句からステータスを直接フィルター処理していることがわかります。

于 2013-01-30T21:16:35.213 に答える
0

これを試して:

SELECT areas.name AS aname, COUNT(consultants.id) AS cct 
    FROM areas LEFT OUTER JOIN consAreas 
      ON consAreas.areaID = areas.id 
    LEFT OUTER JOIN consultants ON consAreas.consultantID=consultants.id AND consultants.active = 1
   WHERE areas.areaID = $area 
     GROUP BY areas.id 
ORDER BY areas.name
于 2013-01-30T21:12:49.607 に答える
0

ここで必要なのはLEFT JOIN(左外部結合) です。

A JOIN(実際には内部結合) は、両方のテーブルに対応する行がある場合にのみ、JOIN の結果の行を選択します。左の結合は、右のテーブルに一致する行があるかどうかに関係なく、左のテーブルにのみ一致する行がある場合に行を選択します。

したがって、コンサルタント テーブルへの結合では、次のようになります。

SELECT areas.name AS aname, COUNT(consAreas.area) AS cct 
FROM areas LEFT OUTER JOIN consAreas 
ON consAreas.area = areas.id 
LEFT JOIN consultants ON consultants.id = consAreas.cons
于 2013-01-30T21:11:47.853 に答える
0

LEFT JOINを実行してを修正する必要がありますGROUP BY。これを試して:

SELECT areas.name AS aname, COUNT(consultants.active) AS cct 
    FROM areas 
    LEFT JOIN consAreas 
      ON consAreas.area = areas.id 
    LEFT JOIN consultants 
      ON consultants.id = consAreas.cons
   WHERE areas.areaID = $area 
     AND consultants.active = 1
GROUP BY areas.name
ORDER BY areas.name

これにより、エリアの名前とアクティブなコンサルタントの数を含むテーブルが返されます

于 2013-01-30T21:12:09.420 に答える