2009-09-06 8 views
0

글쎄, 다른 테이블에 행이 없으면 하나의 테이블에서 행을 선택하려고했습니다.Mysql, NOT EXISTS, SELECT

SELECT * FROM `jos_datsogallery` as a WHERE a.published = 1 
and a.approved=1 NOT EXISTS (SELECT * FROM `jos_datsogallery_votes` 
As v WHERE v.vip=62 AND v.vpic=a.id) ORDER BY a.imgdate DESC 

하지만 실패 유지 :

내 원래 쿼리이었다.

나는 몇 가지 테스트를 만들어 내 쿼리를 단축 : 항상 true입니다 '를 선택합니다 (1) EXISTS'로 jos_datsogallery에서 모든 것을 선택하도록되어

SELECT * FROM `jos_datsogallery` WHERE EXISTS (SELECT 1) 

.

내가 phpMyAdmin을 시도 :

1064 - 당신은 당신의 SQL 구문에 오류가 있습니다. 이

문제점은 무엇입니까 라인 1에서 'LIMIT 0, 30 (1 선택) EXISTS'를 근처 사용할 수있는 권리 구문에 대한 MySQL 서버에 버전에 해당하는 설명서를 확인?

MySQL 버전 : 4.0.27

의 MySQL 문서 :

답변

5

EXISTShttp://dev.mysql.com/doc/refman/4.1/en/exists-and-not-exists-subqueries.html은 4.1에서 지원 이상됩니다 - 당신이 링크 된 문서는 모두 4.0/4.1에 대한 통합 문서 때문에이 같은 오해의 소지가있을 수있다 어떤 버전이 실제로 키워드를 지원하는지 알려줍니다.

질문을 업데이트하여 4.0.x를 사용 중이라는 이유가 그것이 작동하지 않는 이유입니다.

2

NOT EXISTS을 사용하지 않고도 동일한 결과를 얻을 수있는 또 다른 방법입니다. 가입 좌측 사용

SELECT * FROM `jos_datsogallery` AS a 
LEFT JOIN `jos_datsogallery_votes` AS v ON v.vip=62 AND v.vpic=a.id 
WHERE a.published = 1 AND 
a.approved=1 AND 
v.vip IS NULL 
ORDER BY a.imgdate DESC 

조인합니다 (jos_datsogallery_votes 일부)의 오른쪽 여전히 결과를 리턴하는 동안 행을 찾을 수있다 의미한다. 조인의 오른쪽이 발견되지 않으면 해당 열은 모두 NULL 값을 가지며, 쿼리의 WHERE 부분에서 확인할 수 있습니다.

HTH

+0

감사합니다. 나는 지금 그것을 시도 할 것이다. – undsoft

1

조금 늦게, 그러나 나는 유사한 무언가를 찾고 있었다 그것은 다른 사람에게 유용 할 수 있습니다. 이를 수행하는 또 다른 방법은 where 절에서 카운트를 사용하는 것입니다. 문의하신 내용은 다음과 같습니다.

SELECT * FROM `jos_datsogallery` AS a 
WHERE a.published = 1 
AND a.approved=1 
AND (
    SELECT COUNT(*) FROM `jos_datsogallery_votes` AS v 
    WHERE v.vip=62 
    AND v.vpic=a.id 
) = 0 
ORDER BY a.imgdate DESC