2014-10-04 3 views
1

블로그 게시물 용 테이블이 있습니다. 사용자가 게시물을 다시 블로그하면 source_hash 필드는 원래 게시물의 해시로 채워집니다. 원래 게시물의 작성자 (사용자 이름)도 저장할 수 있지만 사용자 이름을 변경하면 ... 글쎄, 내가 어디로 가는지 알 수 있습니다.mySQL 하위 쿼리가 NULL을 반환합니다.

그래서 내가하고자하는 일은 부모 쿼리의 source_hash 필드를 사용하여 하위 정보에서 원본 작성자의 사용자 이름을 더하여 모든 게시물의 정보를 얻는 것입니다. 하위 쿼리를 제외하고 모든 것이 완벽하게 작동합니다. NULL을 반환합니다.

나는 그것의 고기를 얻기 위해 약간의 쿼리 (다소 큰 것)를 제거했다. 바라기를 이것은 의미가 있습니다!

SELECT 
    p.id AS pid 
, p.uid 
, p.hash 
, p.source_hash 
    ... 
, u.id AS uid 
, u.username 
, u.avatar 

, s.username AS source 

FROM posts p 
LEFT JOIN users u ON p.uid=u.id 
... 

# problematic subquery 
LEFT JOIN users s ON (SELECT username FROM posts po LEFT JOIN users s ON s.id=po.uid WHERE po.hash=p.source_hash) 

WHERE p.uid=1 
GROUP BY p.id ORDER BY p.id DESC 

편집 : 나는 SQL Fiddle을 작성하여 모든 것을 기본 구성 요소로 축소했습니다. 바이올린에서 source 열은 lindsey

http://sqlfiddle.com/#!2/0183e/2

+0

이 모든 독립적 인 하위 쿼리가 데이터를 가지고, 당신은 – anish

+0

@anish 예, 하위 쿼리가 올바른 사용자 이름 때를 얻을 수 있는지 테스트 않았다 나는 해쉬'SELECT s.username FROM posts po 왼쪽 가입 사용자에게 s.id = po.uid WHERE po.hash = '2djeij83k'' – timgavin

+0

테이블 구조와 테스트 데이터를 게시 할 수 있습니까? [SQL Fiddle] (http://sqlfiddle.com/)이 도움이 될 것입니다. – wchiquito

답변

0

당신은 하위 쿼리가 쿼리에 문제가 사용하는 ON 상태를 반환해야합니다 - 짧은에서 잘못입니다. 나는이 경우 다음 쿼리를 작성합니다

(테스트는 올바른 결과를 반환) :

SELECT 
    p.id AS pid 
, p.uid 
, p.hash 
, p.source_hash 
    ... 
, u.id AS uid 
, u.username 
, u.avatar 

, u2.username AS source 

FROM posts p 
LEFT JOIN users u ON p.uid=u.id 
... 

# instead of subquery use left join with posts again for source post 
LEFT JOIN posts p2 ON p.source_hash = p2.hash 
# then join source post with another user table to get source username 
LEFT JOIN users u2 ON u2.id = p2.uid 

WHERE p.uid=1 
GROUP BY p.id ORDER BY p.id DESC 
+0

그 트릭을했습니다. 감사! :) – timgavin

관련 문제