php - 用于一对一简单聊天的 MySQL 数据库模式

标签 php mysql chat mariadb

我尝试使用这些模式进行简单的聊天:

mes_id  int(10) unsigned Auto Increment  
mes_useid_receiver  int(10) unsigned     
mes_useid_sender    int(10) unsigned     
mes_date    int(10) unsigned     
mes_message text     
mes_read    tinyint(3) unsigned [0]  
mes_visible_for_who int(10) unsigned NULL   NULL = both; 0 = none; ID user

问题是,如何获取已接收消息和已发送消息的联系人列表?

我正在尝试这样的事情:

SELECT use_name, MAX(mes_date) AS date 
FROM message JOIN user ON mes_useid_receiver=use_id 
WHERE uti_id!=1 
AND (mes_useid_receiver=1 OR mes_useid_sender=1) 
AND (mes_visible_for_who IS NULL OR mes_visible_for_who=1) 
GROUP BY use_id 
ORDER BY date DESC

但是通过这个查询,我只能得到向 user_id = 1 发送消息的联系人,我还想得到 user_id = 1 的联系人 已发送消息。

已编辑:

有了 union 我几乎可以得到我想要的:

SELECT use_id, use_name, mes_read FROM message
JOIN user ON mes_useid_receiver=use_id
WHERE use_id!=1 
AND (mes_useid_receiver=1 OR mes_useid_sender=1) 
AND (mes_visible_for_who IS NULL OR mes_visible_for_who=1) GROUP BY use_id

UNION

SELECT use_id, use_name, mes_read FROM message
JOIN user ON mes_useid_sender=use_id
WHERE use_id!=1 
AND (mes_useid_receiver=1 OR mes_useid_sender=1) 
AND (mes_visible_for_who IS NULL OR mes_visible_for_who=1) GROUP BY use_id

我需要 mes_date 来对列表进行排序,但如果我选择 mes_date,我将得到重复的行。

感谢您的帮助。

最佳答案

如果你要进入这个根目录,那么我的建议如下:

SELECT *  FROM(

    (SELECT use_id, use_name, mes_read ,mes_date FROM message
    JOIN user ON mes_useid_receiver=use_id
    WHERE use_id!=1 
    AND (mes_useid_receiver=1 OR mes_useid_sender=1) 
    AND (mes_visible_for_who IS NULL OR mes_visible_for_who=1)) GROUP BY use_id 

    UNION

    (SELECT use_id, use_name, mes_read ,mes_date FROM message
    JOIN user ON mes_useid_sender=use_id
    WHERE use_id!=1 
    AND (mes_useid_receiver=1 OR mes_useid_sender=1) 
    AND (mes_visible_for_who IS NULL OR mes_visible_for_who=1)) GROUP BY use_id 

) as d Order By mes_date desc

也看看你是否可以避免在每个选择中分组(你会觉得表现不佳)

问候

关于php - 用于一对一简单聊天的 MySQL 数据库模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47825981/

相关文章:

php - 在一行mysql中为一个用户选择所有行

python - 全文搜索和 Python

php - 如何在$text中插入广告?

php - jquery打字效果

swift - 使用标识符初始化 ViewController 后隐藏的导航栏

php - WooCommerce get_cart() 为 null

PHP:使用 fetchall() 显示表数据

php - 组织数据库结构

javascript - php foreach循环和表单中的addmore按钮

命令行聊天应用程序中的Java同步输入和输出