MySQL设计,查询,重复行

时间:2009-09-16 21:23:17

标签: sql mysql

我认为我的数据库设计不好,需要一些帮助来改进它。 我的博客帖子有三张桌子。

Posts
-id
-title

Categories
-id
-name

CategoryBindings
-id
-postId
-categoryId

假设我有这些数据:

Posts
1 Title1
2 Title2

Categories
1 category1
2 category2

CategoryBindings
1 1 1
2 1 2
3 2 1

我现在用来获取我的帖子及其类别的查询是

SELECT `p`.*, `cb`.`categoryId`, `c`.`name` AS `categoryName` 
FROM `Posts` AS `p` 
LEFT JOIN `CategoryBindings` AS `cb` ON p.id = cb.postId 
LEFT JOIN `Categories` AS `c` ON cb.categoryId = c.id

结果如下:

1 Title1 1 category1
1 Title1 2 cateogry2
2 Title2 1 cateogry1

我正在获得第1篇文章,因为它们是两个categoryBindings。我编写了一个代码,用php修复了结果,以便我得到。

1 Title1 array(1 category1, 2 category2)
2 Title2 array(1 category1)

它工作正常,直到记得我需要在我的查询中使用限制。我想在每页显示10个帖子但我不能使用限制,因为我的查询返回重复的行。这是一种改变我的查询以使其按照我的意愿工作的方式,还是我需要重新设计我的表?如果是这样,你会如何建议我重新设计我的桌子?

1 个答案:

答案 0 :(得分:1)

您可以使用GROUP_CONCAT AND CONCAT_WS

SELECT `p`.`id`, `p.title`, GROUP_CONCAT(CONCAT_WS(' ', `cb`.`categoryId`, `c`.`name`)) AS `categoryNames` 
FROM `Posts` AS `p` 
LEFT JOIN `CategoryBindings` AS `cb` ON p.id = cb.postId 
LEFT JOIN `Categories` AS `c` ON cb.categoryId = c.id
GROUP BY id, title

顺便说一下:你不应该在代码中SELECT *,更好地明确地写出你想要的东西。如果添加未在代码中使用的列,并且在删除/重命名列时将提前失败,则可以避免不必要的开销。