2013-10-15 98 views
1

我有以下查詢其完美的作品:寫的MySQL查詢連接三個表

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) 
       ) 

這裏接觸表包含ID,名字,姓氏,..和標籤表包含ID,名稱。 contacts2tags表中包含的ContactID和標籤識別哪些是相同contacts.id和tags.id分別

現在,我要的是,以僅顯示其有接觸既有標籤識別7和標籤識別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) 

它也可以。 我的問題是,我想將上面的第二個查詢轉換爲使用內部連接的查詢。 我有一個存儲在$ tmp中的php數組,我在php 中使用這些ID併爲它們寫上面的查詢。 我該怎麼做?我不熟悉sql。可能是一個非常簡單的問題。 在此先感謝

編輯: 回答下面的問題解決了。但是sql對於10k條記錄運行非常緩慢。任何建議來優化它?按照答案中給出的方式粘貼更新後的查詢。

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 

回答

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 
+0

感謝lot.it工程:)所以,現在我可以包括我的數組$ tmp目錄中的所有元素在(...),並使用sizeof的值($ tmp)? – user415

+0

是的,然後你必須在'having'子句中調整數字。 –

+0

沒錯。謝謝! – user415