2011-04-29 58 views
1

我有以下表格:使用三个表检索数据连接

Post (id, title, author_id) etc 
Tags 
Post_tags 
Author 

下面的SQL查询似乎只得到第一个线程,与所有标签一起。

SELECT post. * , author.username, 
GROUP_CONCAT(DISTINCT tag.name ORDER BY tag.name DESC SEPARATOR ',') AS tags 
FROM author, post 
JOIN post_tags ON post.id = post_tags.thread_id 
JOIN tag ON post_tags.tag_id = tag.id 
WHERE author.id = post.author_id 

我在做什么错在这里?

+0

您通常使用具有GROUP BY子句的'GROUP_CONCAT()'。 – 2011-04-29 23:30:57

+0

而标题应该说**四**表 – 2011-04-29 23:43:10

+0

是的,我改变了,一旦我创建它,你正在看(mem?)缓存版本 – jonnnnnnnnnie 2011-04-30 01:37:41

回答

4

您通常使用GROUP_CONCAT()GROUP BY子句。

没有GROUP BY,这意味着它会将所有行分组为一个,从而显示所有标签的组连接。

您看到的第一个线程数据是MyQSL不良行为的副产品,它允许您在SELECT中显示不依赖于分组字段的字段(在您的情况中不含)。

在最后加入GROUP BY post.id请尝试您的查询。

SELECT post. * 
    , author.username 
    , GROUP_CONCAT(DISTINCT tag.name ORDER BY tag.name DESC SEPARATOR ',') 
     AS tags 

FROM author 
    JOIN post 
    ON author.id = post.author_id 
    JOIN post_tags 
    ON post.id = post_tags.thread_id 
    JOIN tag 
    ON post_tags.tag_id = tag.id 

GROUP BY post.id