2014-02-17 48 views
-1

信息選擇未分配到組(另一個表)中的所有行

我有兩個表。 accounts & accounts_groups_assigned

accounts擁有所有帳戶信息,並accounts_groups_assigned包含已分配到組帳戶的標識。主要結構沒有任何獨特之處。只是基本的ID列和名稱等,如果真的需要我會將它添加到帖子中,但正如前面提到的,它非常通用。

問題

我需要能夠選擇所有從accounts還沒有被分配到一組尚未決算。現在,這在PHP中很容易實現,但我希望能夠使用MySQL進行一次查詢。

根據要求,表結構。

accounts

ID | Name

而且

accounts_groups_assigned

ID | Group_id | account_id

+0

@FreshPrinceOfSO我不知道在哪裏,即使檢查查詢內的另一個表開始,我曾嘗試研究左聯接和子查詢的,但我對我的目標應該是從子回來不確定 - 這對於初始查詢很有用。最後,感謝您將您的評論修改爲我實際可以回覆的內容。 – Harry

+0

至少,我們需要查看錶結構。 – Kermit

+0

更新與表結構,希望他們幫助。 – Harry

回答

1

像這樣的事情?

SELECT * FROM accounts a 
    LEFT JOIN accounts_groups_assigned aga ON a.ID = aga.account_id 
WHERE aga.account_id IS NULL 

LEFT JOIN兩個表在這裏連接在一起,以確保從accounts所有記錄將顯示,即使他們在accounts_groups_assigned表中沒有匹配的行。在不匹配的情況下,accounts_groups_assigned中的account_id將是NULL

然後,我們可以使用WHERE aga.accounts_groups_assigned IS NULL來查找account_id尚未鏈接到group_id的所有情況。

+0

完美的作品!感謝您爲解決這個問題而努力,而不是在免費的編輯點挑選我的問題。 – Harry

0

那麼呢?

SELECT 
    * 
FROM 
    accounts 
LEFT JOIN accounts_groups_assigned groups ON accounts.id = groups.account_id 
WHERE 
    groups.account_id IS NULL; 

LEFT JOIN鏈接匹配id字段的表。 WHERE條款通過選擇全部accounts給出了您希望的結果,其中沒有accounts_groups_assigned ...分配。有關JOINS的詳細說明,請參閱this文章。

+0

我希望這也能工作!感謝您的時間。 – Harry

0

我喜歡使用NOT IN從另一個表中排除數據,因爲它比實現LEFT JOIN和檢查NULL更清晰。

SELECT 
    columns 
FROM 
    accounts a 
WHERE 
    a.id NOT IN (
    SELECT 
     account_id 
    FROM 
     accounts_groups_assigned 
) 
+0

這也適用,但'JOINS'通常比子查詢快。最好的方法是使用'Show Execution Plan'運行並比較。但是子查詢速度更快的情況很少見。 – hanleyhansen

相關問題