Как добавить левое соединение к этому MySQL Query? - PullRequest
0 голосов
/ 03 июля 2010

Я довольно новичок в этом, поэтому, пожалуйста, прости меня, если это покажется немного легким для некоторых из вас.

Итак, у меня есть этот запрос здесь:

SELECT code.id AS codeid, code.title AS codetitle, code.summary AS codesummary, code.author AS codeauthor, code.rating AS rating, code.date,
                    code_tags.*, 
                    tags.*, 
                    users.firstname AS authorname, 
                    users.id AS authorid,
                    GROUP_CONCAT(tags.tag SEPARATOR ', ') AS taggroup
                    FROM code, code_tags, tags, users
                    WHERE users.id = code.author AND code_tags.code_id = code.id AND tags.id = code_tags.tag_id
                    GROUP BY code_id
                    ORDER BY date DESC

Довольноинтенсивный.Я хочу посчитать количество комментариев, которые code имеет в представлении таблицы комментариев.Я не могу добавить его как WHERE comments.codeid = code.id, потому что тогда он не выберет представления из базы данных без комментариев.

Как я могу добавить что-то в соответствии с LEFT JOIN comments.codeid ON code.id = comments.codeid или что-то в этом духе?

Спасибо!

Джек

Ответы [ 2 ]

1 голос
/ 03 июля 2010

Измените существующие объединения, чтобы они соответствовали SQL-92 JOINS, и добавление left join s становится тривиальным.

SELECT 
  code.id AS codeid, code.title AS codetitle, code.summary AS codesummary, code.author AS codeauthor, code.rating AS rating, code.date,
  code_tags.*, 
  tags.*, 
  users.firstname AS authorname, 
  users.id AS authorid,
  GROUP_CONCAT(tags.tag SEPARATOR ', ') AS taggroup
FROM 
  code
  join code_tags on code_tags.code_id = code.id
  join tags on tags.id = code_tags.tag_id
  join users on users.id = code.author
  left join comments on comments.codeid = code.id
GROUP BY code_id
ORDER BY date DESC

Обратите внимание, что, как правило, выбор * в запросе считается плохой идеей. Извлекайте только те столбцы, которые вам действительно нужны.

0 голосов
/ 03 июля 2010

Используйте count (comments.code_id) и оставьте соединение, чтобы получить количество комментариев.Чтобы это работало, вам нужно сгруппировать все возвращаемые столбцы, кроме comments.code_id. Некоторые базы данных (например, MS Access) не могут группировать поля, выбранные с помощью *, поэтому вам придется выбрать их по имени, а затем включить ихв группе по.

например, если в таблице code_tags есть поля code_id и tag_id , а в таблице теги есть поля id и tag тогда он должен выглядеть следующим образом:

SELECT code.id AS codeid, code.title AS codetitle,  
code.summary AS codesummary, code.author AS codeauthor,  
code.rating AS rating, code.date,  
code_tags.code_id, code_tags.tag_id, tags.id, tags.tag,  
users.firstname AS authorname, users.id AS authorid,  
GROUP_CONCAT(tags.tag SEPARATOR ', ') AS taggroup  
count(comments.code_id) as NumComments  
FROM  
code JOIN code_tags ON code_tags.code_id = code.id  
JOIN tags ON tags.id = code_tags.tag_id  
JOIN users ON users.id = code.author  
LEFT JOIN comments ON comments.code_id = code.id  
GROUP BY code_id, codetitle, codesummary, codeauthor, rating, code.date,  
code_tags.code_id, code_tags.tag_id, tags.id, tags.tagName,
authorname, authorid, taggroup
ORDER BY date DESC  
...