gpt4 book ai didi

sql - MySQL 设计、查询、重复行

转载 作者:行者123 更新时间:2023-11-30 21:23:38 25 4
gpt4 key购买 nike

我认为我的数据库设计很糟糕,需要一些帮助来改进它。我的博客文章有三个表格。

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

我得到了 post 1 的副本,因为它们是它的两个 categoryBindings。我写了一段代码,用 php 修复了结果,这样我就得到了。

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

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

最佳答案

您可以使用 GROUP_CONCATCONCAT_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 *,最好明确地写下你想要的。如果您添加一个代码中未使用的列,它可以避免不必要的开销,如果您删除/重命名一个列,它将提前失败。

关于sql - MySQL 设计、查询、重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1435548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com