2014-11-09 3 views
1

다음 SQL을 사용하여 포럼의 주제를 나열합니다.SQL 내부 조인 퍼즐

select t.* , lp.latestpost, lp.lpname 
from forum_topics as t 
inner join ( 
    select p.topic, max(p.date) as latestpost, p.author_name as lpname 
    from forum_replies p 
    group by p.topic 
) lp on lp.topic = t.id 
order by lp.latestpost desc 
LIMIT 20 

문제점은 마지막 포스터 (lpname)의 주제에 대한 올바른 이름을 부여하지 못하는 것입니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

1

MySQL 확장을 사용하고 있기 때문에성에 임의의 값이 표시됩니다. 일반적으로 집계의 일부인 select의 열은 집계 함수 또는 group by 절에 있어야합니다. 귀하의 경우에는 p.author_name이 아닙니다.

당신은이 group_concat()substring_index()을 포함하는 해킹하여 수정할 수 있습니다

select t.* , lp.latestpost, lp.lpname 
from forum_topics as t inner join 
    (select p.topic, max(p.date) as latestpost, 
      substring_index(group_concat(p.author_name order by p.date desc separator '|' 
             ), '|', 1) as as lpname 
     from forum_replies p 
     group by p.topic 
    ) lp 
    on lp.topic = t.id 
order by lp.latestpost desc 
LIMIT 20;