在 SQL 中显示邮件列表
Show Message List in SQL
我想像 facebook messenger 一样显示消息列表,在左上角你可以看到你发出的所有消息。
user_table
user_id
user_firstname
user_latsname
message_table
message_id
message_user_id
message_to_user_id
message_content
message_time_stamp
我的SQL
SELECT user_table.user_id,
CONCAT(user_table.user_firstname,' ',user_table.user_lastname) AS user_fullname,
message_table.message_user_id,
message_table.message_content,
message_table.message_time_stamp
FROM user_table
INNER JOIN message_table
ON user_table.user_id = message_table.message_user_id
WHERE (message_table.message_to_user_id = '$session')
ORDER BY message_table.message_time_stamp DESC
如果有人先给我发消息,我的代码就可以正常工作。
它在我的消息列表中显示有人给我发消息。
但是,当我是第一个发出消息的人时。
它没有显示在我的消息列表中。
在我可以在我的消息列表中看到它之前,他应该在我的消息中回复。
但是我想显示什么时候有人给我发消息,什么时候我是第一个发消息的人。
message_table with sample data
user_table with sample data
result
但是当我在 user_table 中添加新用户并向他发送消息时。它不会显示在我的消息列表中。
我希望我的预期结果是当我向新用户发送消息时它会显示在我的消息列表中
你的行(在 sql 查询中)
message_table.message_to_user_id = '$session'
可能是您看不到自己发送的消息的原因(因为您不是收件人)
要获取您涉及的所有消息,它可能应该是:
message_table.message_to_user_id = '$session' or message_table.message_user_id = '$session'
我希望 $session 不是用户提供的,或者您手头有一些可能的 sql-注入 ;o)
解决方案
SELECT user_id, user_fullname, message_content
FROM
(
(SELECT user_table.user_id,
CONCAT(user_table.user_firstname,' ',user_table.user_lastname) AS user_fullname,
message_table.message_user_id,
message_table.message_content,
message_table.message_time_stamp
FROM user_table
INNER JOIN message_table
ON user_table.user_id = message_table.message_to_user_id
WHERE (message_table.message_user_id = '$session')
)ORDER BY message_time_stamp DESC
UNION DISTINCT
(SELECT user_table.user_id,
CONCAT(user_table.user_firstname,' ',user_table.user_lastname) AS user_fullname,
message_table.message_user_id,
message_table.message_content,
message_table.message_time_stamp
FROM user_table
INNER JOIN message_table
ON user_table.user_id = message_table.message_user_id
WHERE (message_table.message_to_user_id = '$session')
)ORDER BY message_time_stamp DESC
) as id GROUP BY user_id ORDER BY message_time_stamp DESC
这是我针对我的问题所做的解决方案。我做了 2 select 声明,其中第一个 select 仅 select 我是发出第一条消息的人,第二个 select 声明 select 是某人先给我留言然后我联合它。
我想像 facebook messenger 一样显示消息列表,在左上角你可以看到你发出的所有消息。
user_table
user_id
user_firstname
user_latsname
message_table
message_id
message_user_id
message_to_user_id
message_content
message_time_stamp
我的SQL
SELECT user_table.user_id,
CONCAT(user_table.user_firstname,' ',user_table.user_lastname) AS user_fullname,
message_table.message_user_id,
message_table.message_content,
message_table.message_time_stamp
FROM user_table
INNER JOIN message_table
ON user_table.user_id = message_table.message_user_id
WHERE (message_table.message_to_user_id = '$session')
ORDER BY message_table.message_time_stamp DESC
如果有人先给我发消息,我的代码就可以正常工作。 它在我的消息列表中显示有人给我发消息。 但是,当我是第一个发出消息的人时。 它没有显示在我的消息列表中。 在我可以在我的消息列表中看到它之前,他应该在我的消息中回复。 但是我想显示什么时候有人给我发消息,什么时候我是第一个发消息的人。
message_table with sample data
user_table with sample data
result
但是当我在 user_table 中添加新用户并向他发送消息时。它不会显示在我的消息列表中。
我希望我的预期结果是当我向新用户发送消息时它会显示在我的消息列表中
你的行(在 sql 查询中)
message_table.message_to_user_id = '$session'
可能是您看不到自己发送的消息的原因(因为您不是收件人)
要获取您涉及的所有消息,它可能应该是:
message_table.message_to_user_id = '$session' or message_table.message_user_id = '$session'
我希望 $session 不是用户提供的,或者您手头有一些可能的 sql-注入 ;o)
解决方案
SELECT user_id, user_fullname, message_content
FROM
(
(SELECT user_table.user_id,
CONCAT(user_table.user_firstname,' ',user_table.user_lastname) AS user_fullname,
message_table.message_user_id,
message_table.message_content,
message_table.message_time_stamp
FROM user_table
INNER JOIN message_table
ON user_table.user_id = message_table.message_to_user_id
WHERE (message_table.message_user_id = '$session')
)ORDER BY message_time_stamp DESC
UNION DISTINCT
(SELECT user_table.user_id,
CONCAT(user_table.user_firstname,' ',user_table.user_lastname) AS user_fullname,
message_table.message_user_id,
message_table.message_content,
message_table.message_time_stamp
FROM user_table
INNER JOIN message_table
ON user_table.user_id = message_table.message_user_id
WHERE (message_table.message_to_user_id = '$session')
)ORDER BY message_time_stamp DESC
) as id GROUP BY user_id ORDER BY message_time_stamp DESC
这是我针对我的问题所做的解决方案。我做了 2 select 声明,其中第一个 select 仅 select 我是发出第一条消息的人,第二个 select 声明 select 是某人先给我留言然后我联合它。