Php 如何执行此SQL查询?
我有一些消息和当前用户 消息具有Php 如何执行此SQL查询?,php,mysql,sql,Php,Mysql,Sql,我有一些消息和当前用户 消息具有id,用户具有id 我想获得(唯一)用户ID列表,其中: 第一个用户id用于向当前用户发送消息的用户,该用户具有最高的消息id 最后一个用户id的所有消息id都低于向当前用户发送消息的任何其他用户的消息id 到目前为止,我能够获得向当前用户发送消息的用户列表,其中包括: "SELECT sender_id AS messgr_id FROM messages WHERE receiver_id = '$curr_id' UNION SELECT
id
,用户具有id
我想获得(唯一)用户ID列表,其中:
第一个用户id
用于向当前用户发送消息的用户,该用户具有最高的消息id
最后一个用户id的所有消息id都低于向当前用户发送消息的任何其他用户的消息id
到目前为止,我能够获得向当前用户发送消息的用户列表,其中包括:
"SELECT sender_id AS messgr_id FROM messages
WHERE receiver_id = '$curr_id'
UNION SELECT receiver_id AS messgr_id FROM messages
WHERE sender_id = '$curr_id' ";
但我一直在寻找以我想要的方式订购它的最佳方法(我正在学习SQL,所以我不是专家:)
谢谢 像这样的事情应该能奏效
SELECT *
FROM (
SELECT sender_id AS messgr_id FROM messages
WHERE receiver_id = '$curr_id'
UNION SELECT receiver_id AS messgr_id FROM messages
WHERE sender_id = '$curr_id'
) T1
GROUP BY messgr_id
ORDER BY messgr_id DESC
这将为您提供一个用户ID列表,其中消除了重复项,并从高到低排序
更新: 重新阅读您的问题,听起来您正在查找按消息id排序的用户id列表——您的示例中当前未显示该列表。假设您的
messages
表有一个id
列(除了receiver\u id
和sender\u id
),您可以这样做:
SELECT messgr_id, max(message_id) as max_message_id
FROM (
SELECT sender_id AS messgr_id, id as message_id FROM messages
WHERE receiver_id = '$curr_id'
UNION SELECT receiver_id AS messgr_id, id as message_id FROM messages
WHERE sender_id = '$curr_id'
) T1
GROUP BY messgr_id
ORDER BY max_message_id DESC
我不确定,但我想你只想订购你的选择
"SELECT sender_id AS messgr_id FROM messages
WHERE receiver_id = '$curr_id'
ORDER BY sender_id
UNION SELECT receiver_id AS messgr_id FROM messages
WHERE sender_id = '$curr_id'
ORDER BY sender_id DESC";
你能简单地解释一下你的数据库模式吗?你想要什么作为输出?向当前用户发送或从当前用户接收消息的所有用户的ID?或者仅仅是向当前用户发送最后一条消息并从当前用户接收最后一条消息的两个用户的两个ID?所有用户的ID…但是列表应该是唯一的…OP要求没有重复项,这意味着GROUP BY或DISTINCT都是等式的一部分。实际上-我得到了更正。工会将负责消除重复。非常感谢更新后的答案很可能就是我想要的…我可以用英语表达,但不能用代码表达…我会尽快尝试接受!再次感谢!嗯,您确定在内部选择中选择“id”是好的吗?…这似乎会将联合“拆分为非唯一的用户id,因为消息id不同…或者通过messgr_id分组解决了这一问题吗?您在两个方面都是正确的:添加
id
会拆分联合,但是,groupby
消除了重复的结果,同时还允许我们为每个用户id提取maxmessage\u id
。