2016-09-03 6 views
0

내가 가지고있는 meta_key이 존재하고 ''가 아닌 경우 애완 동물의 게시물을 반환하는 쿼리 :MySQL의 : 리턴 게시물 meta_key가 존재하지 않는 경우

-- Pets that are assigned tags 
SELECT p.ID 
FROM FxFfekP0_posts p LEFT JOIN FxFfekP0_postmeta pm 
ON p.ID = pm.post_id 
WHERE p.post_type = 'pets' 
AND pm.meta_key = 'tag' 
AND pm.meta_value != '' 

하지만 지금이 포스트를 포함한 결과 세트를 얻을 필요 메타 키 tag이 전혀 없거나 메타 키 tag = '... ...

도움말?

답변

1

이런 식으로 뭔가 작업을해야합니다 :

SELECT p.ID 
FROM FxFfekP0_posts p LEFT JOIN FxFfekP0_postmeta pm 
ON p.ID = pm.post_id AND pm.meta_key = 'tag' 
WHERE p.post_type = 'pets' 
AND ifnull(pm.meta_value, '') = '' 

내가 조인 조건에 pm.meta_key = 'tag' 이동, 그래서 행이 여전히 결과 집합 (NULL로들) 표시가 누락; 그러면 ifnull()은 단일 조건이 NULL과 빈 문자열을 모두 선택할 수있게합니다.

SELECT p.ID 
FROM FxFfekP0_posts p 
LEFT JOIN FxFfekP0_postmeta pm ON pm.post_id = p.ID 
AND pm.meta_key = 'tag' 
WHERE p.post_type = 'pets' 
AND pm.meta_key IS NULL 
OR pm.meta_value = '' 
+0

내가 심하게 조인에 조건을 이동 설명했다면 단지 비교 :이 쿼리가 실패 할 경우 누군가가 지적하지 않는 한 내가 무엇 ... 찾고 있어요 – Hobo

+0

기본적으로 둘을 구분해야합니다. 어떤 애완 동물이 태그를 가지고 있는지 알고 싶습니다 (태그가 있고 비어 있거나 NULL이 아닙니다) ... 그리고 나서 어떤 애완 동물이 태그를 가지지 않았는지 (전혀 가치 없음), 또는 태그 입력이 공백인지를 알아야합니다. – dcolumbus

+0

나는 조금 길다. 첫 번째 검색어 (질문에 게시 한 검색어)가 있습니다. 이 쿼리는 태그가 누락되었거나 비어있는 두 번째 결과 집합 (특별히 요청한 내용)을 반환합니다. 내가 테스트 유형 (현재 수정 됨)에서 포스트 유형을 잘못 선택했기 때문에 그것이 작동하지 않는 한? – Hobo

0

나는이 작동 것으로 예상 `선택 p.ID FROM FxFfekP0_posts p LEFT JOIN FxFfekP0_postmeta pm ON p.ID = pm.post_id WHERE p.post_type = 'pets'및 pm.meta_key = 'tag'` with`SELECT p.ID FROM FxFfekP0_posts p LEFT JOIN FxFfekP0_postmeta pm ON p.ID = pm.post_id 및 pm.meta_key = 'tag'WHERE p.post_type = 'post'`. 후자는 postmeta 테이블에 태그 항목이없는 게시물을 포함하여 더 많은 행을 반환해야합니다.
+0

나는'AND'와'OR'의 우선 순위에 조금주의를 기울일 것입니다. 특정 경우에있을 법하지는 않지만 "태그"메타 키가있는 게시 유형이 다른 경우 예기치 않은 결과가 발생할 수 있습니다. MySQL은'where' 절을'WHERE (p.post_type = 'pets'AND pm.meta_key가 NULL) 또는 (pm.meta_value = '')'로 해석합니다. 나는'pm.meta_key IS NULL 또는 pm.meta_value = '''주위에 괄호를 넣었습니다. 그 외에는 논리적으로 내 대답과 같지 않습니까? 자세한 내용은 – Hobo

+0

http://stackoverflow.com/questions/12345569/mysql-or-and-precedence – Hobo