簡體   English   中英

MySQL 左連接子查詢 *

[英]MySQL Left Join Subquery with *

我正在將一個相當簡單的查詢與 JOIN 語句中的子查詢放在一起。 僅當我在子查詢選擇中包含 * 時才有效。 為什么?

這有效

$sql = 'SELECT locations.id, title, name, hours.lobby
        FROM locations
        LEFT JOIN states ON states.id = locations.state_id
        LEFT JOIN (SELECT *, type_id IS NOT NULL AS lobby FROM location_hours) AS hours ON locations.id = hours.location_id
        GROUP BY locations.id';

這不

$sql = 'SELECT locations.id, title, name, hours.lobby
        FROM locations
        LEFT JOIN states ON states.id = locations.state_id
        LEFT JOIN (SELECT type_id IS NOT NULL AS lobby FROM location_hours) AS hours ON locations.id = hours.location_id
        GROUP BY locations.id';

我應該這樣做嗎? 如果您不需要所有字段,我認為 * 不是最好的?

試試這個(如果我正確理解你的意圖,你想過濾 type_id 不為空):

   SELECT locations.id, title, name, hours.lobby
     FROM locations
LEFT JOIN states
       ON states.id = locations.state_id
LEFT JOIN (SELECT location_id, type_id AS lobby
             FROM location_hours 
            WHERE type_id IS NOT NULL) AS hours
       ON locations.id = hours.location_id
 GROUP BY locations.id';

解釋是您必須在內部查詢中選擇外部查詢中引用的所有字段。

由於您希望 type_id 具有非 NULL 值,因此根本不應該使用 LEFT JOIN。 您將需要以下使用標准 JOIN 的內容。

$sql = 'SELECT locations.id, title, name, location_hours.type_id
        FROM locations
        JOIN location_hours ON location_hours.location_id = locations.id
        LEFT JOIN states ON states.id = locations.state_id
        WHERE location_hours.type_id IS NOT NULL
        GROUP BY locations.id';

JOIN 的全部意義在於它只連接實際存在的行。 因此,您不會得到 location_hours 沒有對應 location_id 到locations.id 的任何行。 然后您只需過濾掉 location_hours.type_id 的 NULL 值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM