2013-10-23 71 views
5

我在JOIN語句中放置了一個相當簡單的子查詢。它只適用於在子查詢選擇中包含*的情況。爲什麼?MySQL左加入子查詢使用*

這工作

$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'; 

應我甚至可以做這種方式?如果你不需要所有的領域,我認爲*是不是最好的?

回答

20

試試這個(如果我理解正確的話你的意圖,你想對TYPE_ID不空濾):

$sql = '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'; 

的解釋是,你必須在內部查詢並選擇其中引用的所有領域在外部查詢中。

+1

當您僅從子查詢中選擇一個字段時,您的問題是您無法執行聯接語句,因爲如果您僅選擇了type_id,則子查詢不提供hours.location_id。 – Ashalynd

+0

這是有道理的。我猜想很明顯。無論如何,這工作。謝謝。 – MAZUMA

+0

另外檢查你是否真的需要使用(在第二種情況下)左連接而不是JOIN。如果你不想NULL type_id,那麼我假設你可能真的想運行一個JOIN(通常更快)。 – Ashalynd

0

由於您希望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的空值。

+0

如果我只運行一個連接它的位置行。我想要所有的位置行。然後我想看看是否已經爲這些位置設置了小時數,以查看是否存在NULL值。 – MAZUMA

+0

我不確定我是否明白你的意思。你能重述嗎? 順便說一句,你的LEFT JOIN不工作的原因是因爲子查詢沒有選擇location_id,而是你將它用於ON條件。 – Chill

+0

如果我運行JOIN,它會排除不存在小時type_id的行。我想要獲取所有位置行,然後查看每個位置是否有type_id的值。我使用該值來確定是否需要爲特定位置添加或編輯小時。 – MAZUMA