2013-06-17 2 views
0

UPDATE는 MySQL의 왼쪽 가입을 제외한 값

데이터베이스 모델 sqfiddle에 있습니다 : http://sqlfiddle.com/#!2/8dbb0/10

그리고 주석에 따라 질문을 업데이트했습니다.

이 asume에게 지금은 모든 사용자 2를 표시 할 사용자 (2)에 의해 사용 된 tag_id 1을 수 있습니다

게시물
태그
tag_to_post :

원래 포스트 나는 세 개의 테이블을 가지고 다른 사용자가 tag_id 1로 태그 지정했지만 사용자 2는 지금까지 tag_id 1로 태그 지정하지 않았습니다.

쿼리 :

: 내가 좋아하는 곳-문을 시도

post_id | tags_id | user_tagged_post 
1  | 1  | 1 
1  | 1  | 2 
2  | 1  | 2 
3  | 1  | 1 

그래서 만이 남아 있어야 포스트 ID 3.

첫째 :

SELECT posts.id AS post_id, tags.id AS tag_id, tag_to_post.user_id AS 
user_tagged_post 
FROM posts 
LEFT JOIN tag_to_post ON tag_to_post.post_id = posts.id 
LEFT JOIN tags ON tags.id = tag_to_post.tag_id 
WHERE tags.id =1 

같은 것을 생산

WHERE tags.id = 1 AND tag_to_post.user_id != '2' 

하지만이 과정은 배제되므로 post_id 1을 제외하지 않습니다. WHERE 절 앞에 DISTINCT 또는 GROUPED BY가 있어야한다고 생각합니다. 그러나 허용되지 않는 것 같습니다. 그래서 유일한 방법은 하위 쿼리입니까? 지금까지 해결책을 찾지 못했습니다. 어떤 아이디어?

+1

쿼리에서''foo "'는 어디에 있습니까? – Barmar

+1

나는 여기서 뭘 하려는지 알기가 힘듭니다. 좀 더 명확히 해 주시겠습니까? 어쩌면 각 테이블의 샘플 내용을 보여주고 각 열의 의미를 더 잘 설명 할 수 있습니다. – DaveyLaser

+1

샘플 데이터를 가지고 sqlfiddle.com에서 피들을 만드는 것이 가장 좋습니다. – Barmar

답변

1

, 그것은 정직 LEFT JOIN처럼 보일 것을;

SELECT t1.post_id, p.title, t1.tag_id, t1.user_id 
FROM tag_to_post t1 
JOIN posts p ON t1.post_id = p.id 
LEFT JOIN tag_to_post t2 
    ON t1.tag_id = t2.tag_id AND t1.post_id = t2.post_id AND t2.user_id = 2 
WHERE t1.user_id <> 2 AND t2.user_id IS NULL 

An SQLfiddle to test with.

+1

정말 간단하고 쉽고 효과적이라고 생각합니다. 정확히 내가 무엇을 찾고 있었는지. 감사!! – user2429958

0

는 의견에 따라이

SELECT posts.id, posts.title, tags.tag, tag_to_post.user_id 
FROM posts 
INNER JOIN tag_to_post ON tag_to_post.post_id = posts.id 
INNER JOIN tags ON tags.id = tag_to_post.tag_id 
WHERE tags.id = 1 AND tag_to_post.user_id <> 2 

같은 것을 필요로 할 수 있음 : 내가 제대로 이해하면

SELECT DISTINCT posts.id, posts.title, tags.tag, A.user_id 
FROM posts 
INNER JOIN tag_to_post A ON A.post_id = posts.id 
INNER JOIN tags ON tags.id = A.tag_id 
WHERE tags.id = 1 
AND A.post_id NOT IN (SELECT post_id FROM tag_to_post WHERE tags.id = 1 AND user_id = 2) 
+0

안녕하세요 Sergey, SQFiddle에서 위와 같은 문제가 발생합니다. 검색어는 사용자 1이 태그 한 게시물 3과 게시물 1을 보여줍니다. http://sqlfiddle.com/#!2/8dbb0/10하지만 게시물 1은 이미 사용자 2가 태그를 추가했기 때문에 나타나지 않아야합니다. 문제는 그것이 중복이고 해결책은 where 절 앞에 별개의 것과 같은 것을 만드는 것입니다.하지만 그건 허용되지 않는 것 같습니다. – user2429958

+0

Ok, 답변에서 두 번째 쿼리를보십시오 –

+0

감사합니다 Sergey,이 작품! 하지만 난 그냥 Joachims 버전을 받아 들였습니다. 왜냐하면 내가 피하고 싶었던 하위 쿼리와 함께 작동하기 때문입니다. 다시 한 번 감사드립니다! – user2429958