2012-10-08 39 views
0

我需要做一個PDO語句,交叉引用3個表,它似乎我卡住了。mysql查詢 - 3表 - 不能正確地得到它

它基本上從2個表(myl_contactsmya_users),他們並不需要在myl_blocked_contacts上市需要4個記錄。

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

您到底有什麼問題? – thatidiotguy

+0

*旁註 - myl_contacts和myl_blocked聯繫人有4列都是相同的,但區別在於第1個表中存在常規聯繫人,並且在第2個聯繫人中存在被阻止的聯繫人。這可以是第一張桌子上的聯繫人,但是如果它也在第二張桌面上,那麼它會被封鎖(所以人工智能無法發送給他們郵件,這就是實際上對我來說阻塞的意思)。 –

+0

如果您需要查詢幫助,您將不得不發佈相關表格信息以及期望的結果。另外,編輯您的問題以迴應評論。 – thatidiotguy

回答

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

+0

嘿...你的帖子與deizel類似....它會工作,我正在調整...感謝發佈 –

+0

是的,你是對的。但這似乎是最合理的方式。 PLS。讓我評論一下你的'myl_contacts'和'mya_users'表。在'mya_users'中是否有'myl_contacts'中的某個引用(即'mya_users'中的某個列保存了來自'myl_contacts'的聯繫ID)? – TomS

+0

是的,我可以同時使用myl_contacts.contact_id或mya_users.id ...他們是不同的表,我需要在這兩個ID持有...該ID是藝術家的ID和contact_id表示藝術家或標籤的ID,差異東西....我需要他們在哪裏,他們是 –

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

這實際上工作和顯示的東西,但有兩個錯誤: –

+0

它顯示2行兩次,所以它加倍了2輸出行,也沒有保持跟蹤1行,我堵在myl_blocked_contacts –

+0

我調整你的帖子,deizel並且一旦我完成了工作就會讓你發佈。非常感謝你的一段代碼 –