完全に機能する次のクエリがあります。
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