我查看了许多关于多对多查询的问题和解决方案。我似乎无法绕过它。也许我并没有完全理解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
答案 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表。