MySQL多对多查询混淆

时间:2015-04-02 18:51:00

标签: mysql sql

我查看了许多关于多对多查询的问题和解决方案。我似乎无法绕过它。也许我并没有完全理解MySQL中的关键字。但...

我有3张桌子。第一个表是人员联系信息列表。第二个表是邮件列表类别列表。第三个表是一个关联表,用于保存第一个和第二个表中的id's。如何编写MySQL查询以获取联系人表中与VIP list id(我已经拥有)匹配的所有联系人?

表1(联系方式)

id  |  name  |  email
-----------------------------
1   |  John  | john@gmail.com
-----------------------------
2   |  Jane  | jane@gmail.com
-----------------------------

表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

3 个答案:

答案 0 :(得分: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'

如果您已经拥有id VIP's,那么您只需要加入2个表

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

答案 1 :(得分: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 = ?

答案 2 :(得分: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,那么您根本不需要进行任何加入......

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表。