mysql查询 - 3个表 - 无法正确使用

时间:2012-10-08 19:41:31

标签: php mysql sql

我需要做一个交叉引用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();

2 个答案:

答案 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 ...