2015-04-02 62 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表都没有。