0

例如,我有 3 个表:首先是“用户”,其中每个用户都存储了他的名字。第二 - “位置”,存储用户地址的位置 - 通常 1 个地址对应 1 个用户。第三个 - “消息” - 每个用户通常都有一堆记录。

当加入这三个表时 - 比如

SELECT Users.name, Location.address, Messages.message FROM Users
LEFT JOIN Location ON Location.user_id = Users.id
LEFT JOIN Messages ON Messages.user_id = Users.id
WHERE blah blah

结果将包含许多重复记录,因为表“消息”对于每个用户都有许多记录。这些重复项会减慢获取速度。所以我正在寻找解决方案,如何优化它。例如,我尝试GROUP_CONCAT()使用GROUP BY User.id- 但是当结果GROUP_CONCAT()变得相对较长时,GROUP_CONCAT()开始返回NULL. 而且我无法掌握它,我试图设置group_concat_max_lenmax_allowed_packet设置高值 - 所有这些都没有运气。

那么,有人对此有任何想法吗?

ps 可能需要注意的是,在我的真实案例中,我有很多列,而不是只有一列“消息”,并且有许多不同的行。我的“消息”表看起来像“消息”、“时间”、“收件人”、“已删除”、“中等”等,而我的 GROUP_CONCAT() 包含所有这些字段。

UPD:GROUP_CONCAT()如果只有一条记录似乎是,似乎会丢弃所有结果NULL。例如,如果使用GROUP_CONCAT(Messages.message, Messages.time), 并且偶尔一行中的时间是NULL,它将返回 NULL。

4

3 回答 3

0

在这种情况下,您实际上可能会受益于像 Mongo 这样的文档存储数据库,用于存储消息。

于 2013-03-25T19:53:41.113 回答
0

结果将包含许多重复记录,因为表“消息”对于每个用户都有许多记录。

通过“重复”,是否意味着对于每条唯一消息都会有一行,并且该行将包含其他行中存在的用户名和位置的值?您是否在寻求一种将所有消息合并为一个的方法,以便每个用户+位置只有一行?为了速度??

如果这是一个性能问题,我很想听听如何衡量,以及什么足够快。我还想知道,如果你成功了,你将如何区分消息。

于 2013-03-26T07:05:04.987 回答
0

你可能想要group_concat(distinct)

SELECT Users.name, group_concat(distinct Location.address) as locations,
       group_concat(distinct Messages.message) as messages
FROM Users
LEFT JOIN Location ON Location.user_id = Users.id
LEFT JOIN Messages ON Messages.user_id = Users.id
WHERE blah blah
group by users.name
于 2013-03-25T19:54:40.870 回答