2012-10-08 2 views
0

3 개의 테이블을 상호 참조하는 PDO 문이 필요하다.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 개의 열을 가지고 동일하지만 차이점은 첫 번째 테이블에는 정상적인 연락처가 있고 두 번째에는 차단 된 연락처가 있다는 것입니다. 첫 번째 테이블의 연락처가 될 수 있지만 두 번째 테이블에있는 경우 차단됩니다 (그래서 ppl이 메일을 보낼 수 없기 때문에 실제로 차단 된 것입니다). –

+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입니다. diff 물건 .... 나는 그들이 어디 –

1

당신은 당신이에 관심이있는 ID를 선택하는 하위 쿼리 NOT IN를 사용할 수 있습니다

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 개의 출력 행을 두 배로 늘리고 myl_blocked_contacts에서 차단하는 행 1 행을 유지하지 않습니다 –

+0

나는 게시물을 수정합니다. deizel 한 번 해보면 계속 게시됩니다. 코드 조각에 대해 감사합니다. –