0

我需要做一个交叉引用 3 个表的 PDO 语句,看来我被卡住了。

它基本上需要来自 2 个表(myl_contactsmya_users)的 4 条记录,它们不需要列在myl_blocked_contacts中。

在 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();
4

2 回答 2

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'
  )
于 2012-10-08T19:47:29.593 回答
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...

于 2012-10-08T20:01:54.703 回答