2017-04-11 27 views
2

我有3個表,其中一個帳戶,朋友的一個又一個消費者之間存在的。 事情是這樣的:檢查值是否存在,而不是2個表

table_accounts

id | account_name 

table_friends

id | account_id | people_id 

table_consumers

id | account_id | people_id 

我需要跨越以下信息:

其中consumer_id兩個表中並存,簡單的東西是這樣的:

SELECT 
    * 
FROM 
    table_friends, 
    table_consumers 
WHERE 
    table_friend.account_id = 12345 
    AND table_friend.account_id = table_consumers.account_id 
GROUP BY table_friend.people_id 

這個查詢是很慢的

好了,我現在需要得到什麼是consumer_id的朋友表,這是不是在消費者表。而在第三個瞬間,找出哪些consumer_id不會在朋友表中存在。但我認爲這是同樣的事情...

我的疑問是關於邏輯,我想不出如何跨越這一信息。

+0

我不明白你的數據庫模式,你最後的§不清楚你想要什麼,請編輯你想要的字段名稱和表之間的關係 – Blag

回答

2

這可能是或多或少試圖做什麼:(和看一看Subqueries with EXISTS vs IN - MySQL

SELECT * 
FROM table_friends 
WHERE 
    NOT EXISTS (
     SELECT * 
     FROM table_consumers 
     WHERE table_consumers.people_id = table_friends.people_id 
     ) 

順便說一句,你說「這個查詢你有多少行查詢很慢」?什麼是「慢」?你有一些索引,你需要他們嗎?

+0

你的例子也幫了我很多,比如在使用NOT IN時,朋友的例子都能正確工作並滿足我所需。非常感謝您對您的可用性 –

1

你能不能做這樣的事情:

Select a.account_name 
, a.id 
, case when f.id is null then 0 else 1 end isFriend 
, case when c.id is null then 0 else 1 end isConsumer 
from table_accounts a 
left join table_friends f on a.id = f.account_id 
left join table_consumers c on a.id = c.account_id 
+0

這是一個非常有趣的,因爲只返回1或0,但這個工作也很好。謝謝你的時間=) –

1

如果我理解你的問題正確,您可以使用NOT IN來找出每個表的例外。這樣的事情:

SELECT id 
FROM table_consumers 
WHERE account_id 
NOT IN 
    (SELECT account_id 
    FROM table_friends) 

你可以做同樣的事情,顛倒表名找出哪些朋友不在消費者。如果你想在查詢中包括多個表,你可能想看看使用UNION或UNION ALL爲好。請參閱:UNION ALL and NOT IN together

+0

我把這個放在桌子上http://stackoverflow.com/questions/14190788/subqueries-with-exists-vs-in-mysql因爲它可能是閱讀 – Blag

+1

大是好事另外Blag!如果table_consumers或table_friends可能返回空結果 - 使用NOT IN可能會導致嚴重的減速 - 您希望按照Blag的建議來檢查EXISTS。 – CharlieGirl

+0

非常好,這項工作很好,非常快。我的表有更多的2M的記錄每一個,但慢是因爲在查詢:) –

1

看起來你已經有了如何譜寫自己的查詢答案,但你應該想想你的架構的重新設計。如果還不算太晚。

兩個table_friends和table_consumers代表人民。唯一的區別是什麼類型/種類的人。你不想每次需要一個新的屬性添加到人的時候添加新表格。 你需要的是:

table_accounts 
table_people 
table_people_type 
table_people_type_mapping 

最後一個是table_people和table_people_type之間的映射表。 table_people_type您現在可以擁有朋友消費者,但您以後也可以添加不同的類型,而無需更改架構。而你的查詢會更直觀。

同樣,如果模式更改仍然是您的選擇。

+0

一點點的錯誤,我只是試圖簡化系統表,以免弄太糊塗了,不那麼複雜可能:)感謝的想法您的反饋。 –