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 JOINON必要な部分はありませんか?(のように... 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 に答える