作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
例如,如果我有这个消息表,它有这 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 条记录(最后一条)
╔══════════╦══════════╦══════════╦══════════╦
║ 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/
我是一名优秀的程序员,十分优秀!