例如,我有3个表:第一个像'Users',每个用户的名字都存储在这里。第二个- 'Location',存储用户地址的地方-通常是一个用户的一个地址。第三个是“消息”--每个用户通常都有一堆记录。
当连接这三个表时-就像
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结果将包含许多重复的记录,因为表'Messages‘对每个用户都有许多记录。这些副本会减慢抓取速度。因此,我正在寻找解决方案,如何对其进行优化。例如,我尝试使用GROUP_CONCAT()和GROUP BY User.id -但当GROUP_CONCAT()的结果变得相对较长时,GROUP_CONCAT()开始返回NULL。我无法掌握它,我曾尝试将group_concat_max_len和max_allowed_packet设置为较高的值-但都没有成功。
好吧,有人对此有什么想法吗?
ps可能很重要的一点是,在我的实际情况中,我有许多列和许多不同的行,而不是只有一列'message‘。我的'Messages‘表看起来像'message','time','recipient',’deleted','medium‘等等,我的GROUP_CONCAT()包含所有这些字段。
更新:如果只有一条记录显示为NULL,则GROUP_CONCAT()似乎会丢弃所有结果。例如,如果使用GROUP_CONCAT(Messages.message, Messages.time),并且一行中的时间偶尔会为NULL,则将返回NULL。
发布于 2013-03-26 03:53:41
在这种情况下,您实际上可能受益于文档存储数据库,如Mongo,用于存储消息。
发布于 2013-03-26 03:54:41
您可能需要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-26 15:05:05
结果将包含许多重复的记录,因为表'Messages‘对每个用户都有许多记录。
所谓“复制”,是不是意味着每个唯一的消息都会有一行,并且该行将包含其他行中存在的用户名和位置的值?您是否在寻求一种将所有消息合并为一条消息的方法,以便每个user+location只有一行?为了速度??
如果这是一个性能问题,我很有兴趣听到如何衡量,以及什么足够快。我还想知道,如果你成功了,你将如何区分消息。
https://stackoverflow.com/questions/15623493
复制相似问题