2012-03-01 5 views
0

을 선택?MySQL은 다중 테이블 내가 세 개의 테이블이

I'm currently doing like this: 
Q1-Select links (SELECT * FROM `links`) 
Q2-Extract usernames from previous query(Q1) - (SELECT username FROM `user` WHERE iduser=Q1.userid 
Q3-Extract number of comments from Q1 by id (SELECT COUNT(*) as comments FROM `comment` WHERE linkid='Q1.idlink') 

나는 우리가 훨씬 더 최적화 된 방식으로 이것을 할 수 있다고 믿습니다. 해당 사용자 이름으로 링크를 얻는 방법을 알았지 만 코멘트를 집계해야 할 때 막혔습니다. 당신의 코멘트 테이블이 다소 심하게 설계

답변

4
SELECT iduser, username, Link.title, COUNT(idcomment) 
FROM Users 
LEFT JOIN Link ON (iduser = userid) 
LEFT JOIN Comment ON (linkid = idlink) 
GROUP BY iduser, idlink 

주 - '사용자 ID'필드는 필요하지 않으며, 실제로 당신이 가교 기록을 가지고 상황을 초래할 수 있습니다. 예 : 사용자 A에 속한 설명은 사용자 B에 속한 링크 레코드에 링크 될 수 있습니다.

+0

감사합니다. 이것은 정확히 내가 원했던 것입니다! 어떻게 내가 코멘트를 구성해야합니까? 코멘트를 선택할 때 주석에서 userid를 선택하고 있습니다. 컬럼 이름의 이름을 바꿀 필요가 있다는 것을 의미합니까? – ewooycom

+0

사용 용도에 따라 다릅니다. linkid 또는 userid 중 하나만 설정할 수 있도록 허용 할 수 있으므로 하나의 주석은 사용자 또는 링크에만 첨부 할 수 있지만 둘 다 연결할 수는 없습니다. –

+0

둘 다 여기에 요점을 놓친 것 같아요. 한 사용자가 하나의 링크에 대해 의견을 제시합니다. – nnichols

0
SELECT 
    l.idlink 
    , l.title 
    , l.userid 
    , u.iduser 
    , u.username 
    , c.idcomment 
    , c.content 

FROM Link AS l 
    JOIN Users AS u ON u.iduser=l.userid 
    JOIN Comment AS c ON c.linkid=l.idlink 
+0

그는 u.username 및 사용자 –

+0

당 주석의 합으로 그룹을 원하는 아니면 링크 당 댓글 수를 원하는가? 그것이 Q3가 제안하는 것입니다. – nnichols

+0

아, 제 사과. 3 번 질문에 분명히 나왔습니다. –

1

원하는 필드를 SELECT 및 GROUP BY 절에 모두 넣는 습관을 갖도록하는 것이 좋습니다. 당신이 그것을 고집하는 RDBMS를 사용해야 할 때 그렇게 충격적이지 않을 것입니다.

SELECT 
    `l`.`idlink`, 
    `l`.`title`, 
    `u`.`username`, 
    COUNT(`c`,`idcomment`) AS `comment_count` 
FROM `links` `l` 
INNER JOIN `users` `u` 
    ON `l`.`userid` = `u`.`iduser` 
LEFT JOIN `comments` `c` 
    ON `l`.`idlink` = `c`.`linkid` 
GROUP BY 
    `l`.`idlink`, 
    `l`.`title`, 
    `u`.`username` 
+0

"원하는 필드를 SELECT 및 GROUP BY 절에 넣는 습관을 갖도록하는 것이 좋습니다. 그렇게하면 RDBMS를 사용해야 할 때 그런 충격을주지 않을 것입니다." --- 전혀 그렇지 않다. RDBMS **에는 ** 모든 그룹을 열별로 선택해야합니다. 필드별로 그룹을 선택하지 않고 'SELECT COUNT (*)' – zerkms

+0

죄송합니다. 가난하게 나의 부분에 말을했다. 내가 말한 것은 열 목록의 열이 GROUP BY 절이나 일종의 집계 함수 중 하나 여야한다는 것입니다. – nnichols

+0

옙, 그게 훨씬 정확합니다. +1하면 ;-) – zerkms