2015-04-02 65 views
0

我查看了一堆關於多對多查詢的問題和解決方案。我似乎無法繞過它。也許我不完全理解MySQL中的關鍵字。但...MySQL多對多查詢混淆

我有3個表格。第一個表格是人員聯繫信息的列表。第二個表是郵件列表類別的列表。第三個表是關聯表,其中包含第一個和第二個表中的id's。我如何編寫一個MySQL查詢來獲取聯繫人表中與VIP list id(我已擁有)匹配的所有聯繫人?

表1(觸點)

id | name | email 
----------------------------- 
1 | John | [email protected] 
----------------------------- 
2 | Jane | [email protected] 
----------------------------- 

表2(LIST_TYPE)

id | list_name | 
----------------- 
1 | VIP's | 
----------------- 
2 | Generic | 
----------------- 

表3(list_contact_joiner)

contact_id | list_type_id | 
---------------------------- 
    1  |  2  | 
---------------------------- 
    2  |  1  | 
---------------------------- 

這是我試過,但出現語法錯誤

$listID = 1; 

SELECT list_contact_joiner.contact_id 
FROM list_contact_joiner 
WHERE list_id = $listID AS lcj 
INNER JOIN contact_lists AS cl 
ON cl.id = lcj.contact_id 

回答

1
SELECT c.* 
FROM contacts c 
JOIN list_contact_joiner j on j.contact_id = c.id 
JOIN list_type t on j.list_type_id = t.id 
WHERE t.list_name = 'VIP''s' 

如果你已經有了VIP'sid,那麼你需要加入只有2桌

SELECT c.* 
FROM contacts c 
JOIN list_contact_joiner j on j.contact_id = c.id 
WHERE j.list_type_id = 1 
+0

謝謝。我使用了第二個版本,因爲我已經有了可用的列表ID。你能否簡單解釋一下'ON'關鍵字? – 2015-04-02 19:04:48

+0

如果加入2個表格,則需要定義將兩者連接在一起的列。你在'ON'子句中這樣做。 – 2015-04-02 20:41:49

0

是聯接聲明是不正確的。它應該是爲

select 
c.name, 
c.email, 
lt.list_type 
from list_contact_joiner lcj 
join contacts c on c.id = lcj.contact_id 
join list_type lt on lt.id = lcj.list_type_id 
where 
lt.id = ? 

如果您正在使用$listID = 1;尋找數據,則佔位符是 lt.id = ?

0

你的語法錯誤,是因爲所有的表規範(FROM和JOIN)具有前發生WHERE和你有你的別名語法有點搞砸了 - 這應該更好地工作:

$listID = 1; 

SELECT lcj.contact_id 
FROM list_contact_joiner AS lcj 
INNER JOIN contact_lists AS cl 
ON cl.id = lcj.contact_id 
WHERE lcj.list_id = $listID 

但是,如果你正在試圖做的就是讓contact_id那麼你並不需要做任何連接在LL ...

SELECT contact_id 
FROM list_contact_joiner 
WHERE list_id = $listID 

如果您需要的聯繫人信息的其餘部分,那麼你可以試試這個:

SELECT contact.* 
FROM list_contact_joiner 
JOIN contacts ON contacts.id = list_contact_joiner.contact_id 
WHERE list_id = $listID 

請注意,您還是不需要獲得LIST_TYPE表都沒有。