gpt4 book ai didi

php - 如何在MYSQL中选择2列的唯一组合

转载 作者:行者123 更新时间:2023-11-29 12:30:14 25 4
gpt4 key购买 nike

例如,如果我有这个消息表,它有这 3 列

╔══════════╦══════════╦══════════╦══════════╦
║ from_user║ to_user ║ message ║ date ║
╠══════════╬══════════╣══════════║══════════║
║ 1 ║ 2 ║ text ║timestamp ║
║ 1 ║ 3 ║ text ║ .. ║
║ 2 ║ 1 ║ text ║ .. ║
║ 2 ║ 3 ║ text ║ .. ║
║ 3 ║ 1 ║ text ║ .. ║
║ 1 ║ 2 ║ text ║ .. ║
║ 1 ║ 4 ║ text ║ .. ║
║ 3 ║ 1 ║ text ║ .. ║
╚══════════╩══════════╩══════════╩══════════╩

我想要获取用户参与的所有位置,如果我想选择用户 1 拥有的所有对话(他在“from _user”列中的所有记录以及他在“to_user”列中的所有记录),则此“对话”将是:

  1. 用户 1 和 2 之间的对话
  2. 用户 1 和 3 之间的对话
  3. 用户 1 和 4 之间的对话

所以我只会得到按日期排序的每个对话的 1 条记录(最后一条)

╔══════════╦══════════╦══════════╦══════════╦
║ from_user║ to_user ║ message ║ date ║
╠══════════╬══════════╣══════════║══════════║
║ 1 ║ 2 ║ text ║timestamp ║
║ 1 ║ 3 ║ text ║ .. ║
║ 2 ║ 1 ║ text ║ .. ║
║ 2 ║ 3 ║ text ║ .. ║
║ 3 ║ 1 ║ text ║ .. ║
║ 1 ║ 2 ║ text ║ .. ║<--- i would get this one third (conv between 1&2)
║ 2 ║ 3 ║ text ║ .. ║
║ 1 ║ 4 ║ text ║ .. ║<--- i would get this one second (conv between 1&4)
║ 3 ║ 1 ║ text ║ .. ║<--- i would get this one first (conv between 1&3)
╚══════════╩══════════╩══════════╩══════════╩

我不确定如何解决这个问题,我应该使用 GROUP BY 吗?

编辑:对话是指用户发送或接收消息时,对话可以包含多条消息或只有一条消息。我标记的我想要得到的结果是每个对话的最后记录,无论谁发送它,谁接收它,我想要用户进行的每个对话的最后记录。

这次尝试是我能得到的最接近我想要的东西

SELECT id, from_user, to_user
FROM messages
WHERE (to_user = '$usr_id' OR from_user = '$usr_id') AND id IN
(
SELECT MAX(id)
FROM messages
GROUP BY from_user, to_user
)

但我正在获取每个组合的最后一条记录,例如,如果有

id  from_user  to_user
1 1 2
2 1 3
3 4 1
4 2 1
5 1 2

输出是:

id  from_user  to_user
1 1 2
2 1 3
3 4 1
4 2 1

正如您所看到的,id 为 5 的记录没有被选择,因为它是重复的,但 id 1 和 4 的记录是相同的对话,只应输出其中一个

最佳答案

出于可读性目的,我将向您展示第一个查询,该查询可提供您想要的结果,除非查询的用户位于 to_user 列上:

SELECT   from_user, to_user, max(msg_date) latest, id
FROM messages
WHERE to_user = 1
OR from_user = 1
GROUP BY from_user, to_user
ORDER BY latest desc;

要使用 group by 解决此问题,您需要在用户位于 to_user 端时切换 from_user、to_user 列值。您可能还需要一个标志“switched”来指示这些情况。所以,你需要的是:

SELECT id, main_user, other_user, switched, max(msg_date) latest, msg_date, msg
FROM (SELECT id, 1 main_user, if (from_user = 1, to_user, from_user) other_user,
if (from_user=1, 0, 1) switched, msg_date, msg
FROM messages
WHERE to_user = 1
OR from_user = 1) user_messages
GROUP BY main_user, other_user
ORDER BY msg_date desc;

在同一个查询中,您可以使用“switched”来放回 from_user、to_user,就像在子查询中一样使用 IF。我现在没有把它放出来是为了更容易阅读。

关于php - 如何在MYSQL中选择2列的唯一组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27674767/

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