1

完全に機能する次のクエリがあります。

SELECT * 
FROM contacts 
WHERE id in (

             SELECT DISTINCT contacts.id 
               FROM contacts 
             INNER JOIN contacts2tags 
                ON contacts.id = contacts2tags.contactid 
            WHERE tagid in(7,4)
                 )  

ここで、 contactsテーブルには id、first_name、last_name、..が含まれ、 tagsテーブルには id、name が含まれます。contact2tags テーブルには、 contacts.idと tags.id とそれぞれ同じ contactid と tagid が含まれています。

今、私が望むのは、tagid 7 と tagid 4 の両方を持つ連絡先のみを表示することです。次のようなことを試しました。

SELECT * 
FROM contacts
WHERE id IN
    (
     SELECT CT1.contactid 
 FROM
tags T1, contacts2tags CT1, tags T2, contacts2tags CT2
WHERE CT1.contactid = CT2.contactid
 AND CT1.tagid = T1.id
 AND CT2.tagid = T2.id
 AND (T1.id = 7 AND T2.id = 4)

そしてそれも機能します。私の問題は、上記の 2 番目のクエリを内部結合を使用するクエリに変換したいということです。php の $tmp に格納されている ID の配列があります。これらの ID を使用して、上記のクエリを記述します。それ、どうやったら出来るの?私はSQLに慣れていません。質問するのはとても簡単なことかもしれません。前もって感謝します

編集: 以下の回答で問題が解決しました。しかし、10,000 レコードの場合、SQL の実行は非常に遅くなります。それを最適化するための提案はありますか?回答に示されているように、更新されたクエリを貼り付けます。

    SELECT c.id 
     FROM contacts c
    inner join contacts2tags t on c.id = t.contactid 
    where t.tagid in (7,4)
    group by c.id
    having count(distinct t.tagid) = 2
4

1 に答える 1

2

これはうまくいくはずです

SELECT c.id 
FROM contacts c
inner join contacts2tags t on c.id = t.contactid 
where t.tagid in (7,4)
group by c.id
having count(distinct t.tagid) = 2
于 2013-10-15T08:06:17.057 に答える