我需要做一个交叉引用3个表的PDO语句,看起来我已经卡住了。
它基本上需要2个表中的4条记录( myl_contacts 和 mya_users ),并且不需要在 myl_blocked_contacts 中列出。< / p>
在myl_blocked_contacts中是带有id的行,以及被阻止的contact_type('a','l','x'等),我需要从myl_contacts用户中选择我拥有且未被阻止的用户(因此是不在myl_blocked联系人中。)
这是我到目前为止所做的PDO :: mysql查询。我不知道从哪里开始,我在网上尝试了很多东西,但我似乎在某种程度上走错了方向。谢谢!
$query = "SELECT myl_contacts.contact_id, mya_users.name, mya_users.city, mya_users.ext
from myl_contacts, mya_users,
LEFT JOIN myl_blocked_contacts
WHERE myl_contacts.contact_type='a'
AND myl_contacts.label_id=:id
AND (myl_blocked_contacts.contact_type!='a'
AND myl_blocked_contacts.contact_id!=mya_users.id)
";
$result = $db->prepare($query);
$result->bindValue(':id', $_id, PDO::PARAM_INT);
$result->execute();
答案 0 :(得分:1)
您可以使用NOT IN
子查询选择您不感兴趣的ID:
select myl_contacts.contact_id, mya_users.name, mya_users.city, mya_users.ext
from myl_contacts
left join mya_users on myl_contacts.contact_id = mya_users.contact_id -- (?)
where
myl_contacts.contact_type = 'a' and
myl_contacts.label_id = :id and
myl_contacts.contact_id not in
(
select myl_blocked_contacts.contact_id
from myl_blocked_contacts
where myl_blocked_contacts.contact_type <> 'a'
)
答案 1 :(得分:1)
我不确定我的问题是否正确。
我不明白你为什么使用LEFT JOIN
。
是否需要ON
部分? (如... t1 LEFT JOIN t2 ON t1.ID = t2.t1ID ...
)
如果你写的话怎么办?
SELECT
myl_contacts.contact_id,
mya_users.name,
mya_users.city,
mya_users.ext
FROM
myl_contacts,
mya_users,
WHERE
myl_contacts.contact_type='a'
AND myl_contacts.label_id=:id
AND mya_users.id NOT IN
SELECT
contact_id
FROM
myl_blocked_contacts
我也不太明白为什么来自不同表的SELECT
行不相关。这可能有意义,但不一定。如果这些表之间存在某种连接,您可能需要添加INNER JOIN
...