gpt4 book ai didi

mysql - 不要抓重复(MYSQL DISTINCT GROUP BY)

转载 作者:行者123 更新时间:2023-11-29 02:23:57 25 4
gpt4 key购买 nike

我有一个基于对话的消息系统。 (消息被视为论坛主题。类似于 gmail。)表格:

convos (PRIMARY cid)
messages (PRIMARY mid)
users (PRIMARY uid)

convos 中的每一行都是一个线程。 messages 中的每一行都是一个回复,包括它所属的 cid。我通过使用该 cid 抓取 x 个最近的消息来加载对话。我还将用户表加入消息 ON uid。 (每条消息都有发件人的 uid。)从 users 我得到 user_name, avatar。为了说明,基本查询将如下所示:

SELECT
messages.body,
users.avatar
FROM messages
JOIN users ON (users.uid=messages.uid)
WHERE messages.cid=1

如果同一用户多次回复,我会多次抓取她的头像,这是 VARCHAR(头像图片的链接)。为了提高性能,我只想获取每个 avatar 一次。我正在考虑使用 GROUP BYDISTINCT

的子查询

更新

我支持 Robby C 的想法。我有公共(public)聊天室,任何用户都可以在其中回复并且回复越来越多。我将在每页显示 20 个回复。为了仅获得这 20 个回复所需的头像,我这样做:

    SELECT
u.avatar
FROM(
SELECT uid,cid
FROM messages
WHERE cid=1234
ORDER BY date DESC LIMIT 20
) AS m
JOIN users AS u ON (u.uid=m.uid)
GROUP BY u.uid

子查询最近的 20 个回复,使用 JOIN 获取它们的用户数据,然后 GROUP BY users.uid 删除重复项。看起来效果不错。

最佳答案

我认为您正在考虑的子查询不会提高性能。获取两个结果集并使用 uid 在您的代码中匹配它们可能会更容易且性能更高。

获取消息内容的查询:

SELECT
messages.body, messages.uid
FROM messages
WHERE messages.cid=1;

获取头像的查询:

SELECT DISTINCT
users.uid, users.avatar
FROM messages
JOIN users ON (users.uid = messages.uid)
WHERE messages.cid=1;

就查询执行时间而言,我认为与最初的单个查询相比,您不会看到任何改进。但是,您可以减少 IO 和/或网络使用。

如果您发现自己经常获取相同的用户信息,则值得考虑在内存中缓存整个用户表。

关于mysql - 不要抓重复(MYSQL DISTINCT GROUP BY),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26582712/

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