2012-03-01 4 views
0

У меня есть три таблицы:MySQL многоуровневых таблиц ВЫБРАТЬ

Table(attribute1, attribute2...);  
--------------------------------- 
Users(iduser, username)  
Link(idlink, title, userid)  
Comment(idcomment, content, linkid, userid) 

Как выбрать: названия Link, с соответствующим именем пользователя и количество комментариев?

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 

Обратите внимание, что ваш комментарий таблица несколько плохо спланирована - поле «идентификатор» не является необходимым, и на самом деле может привести к ситуации, когда у вас есть сшитая запись. например Комментарий, принадлежащий пользователю A, может быть связан с записью Link, принадлежащей пользователю 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, таким образом, не станет таким шоком, когда вам придется использовать РСУБД, которая настаивает на этом.

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, таким образом, это не станет таким шоком, когда вам придется использовать РСУБД, которая настаивает на этом». --- нет. Ни одна из СУБД ** не требует **, чтобы поместить все группы по столбцам в выборку. Вы даже можете выбрать ни одну из групп по полям, а просто «SELECT COUNT (*)» – zerkms

+0

Извините. С моей стороны плохо сформулировано. Я имел в виду, что столбцы в списке столбцов должны быть либо в предложении GROUP BY, либо в какой-то совокупной функции. – nnichols

+0

yep, и это очень правильно, +1 затем ;-) – zerkms

Смежные вопросы