[英]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.