Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 需要正确的SQL查询吗_Php_Mysql_Sql - Fatal编程技术网

Php 需要正确的SQL查询吗

Php 需要正确的SQL查询吗,php,mysql,sql,Php,Mysql,Sql,表: 这是messages表(类似于私有消息),from_user和to_user是自描述性的,topic_id对此并不重要 现在,我需要选择将显示在当前登录用户收件箱中的消息列表。我将使用会话变量$this\u user=$\u session['id'] 我有一个疑问: +----+----------+-----------+---------+ | id | topic_id | from_user | to_user | +----+----------+-----------+---

表:

这是messages表(类似于私有消息),from_user和to_user是自描述性的,topic_id对此并不重要

现在,我需要选择将显示在当前登录用户收件箱中的消息列表。我将使用会话变量
$this\u user=$\u session['id']

我有一个疑问:

+----+----------+-----------+---------+
| id | topic_id | from_user | to_user |
+----+----------+-----------+---------+
|  6 |        5 | 4         | 5       |
|  2 |        6 | 5         | 2       |
|  3 |        5 | 2         | 5       |
|  4 |        4 | 5         | 4       |
|  5 |        4 | 5         | 4       |
|  7 |        6 | 5         | 2       |
|  8 |        5 | 2         | 5       |
|  9 |        5 | 4         | 5       |
| 10 |        0 | 2         | 5       |
| 11 |        6 | 5         | 2       |
| 12 |        3 | 5         | 2       |
| 13 |        0 | 5         | 2       |
+----+----------+-----------+---------+
但这需要重复的信息,比如4-5,5-4,5-4

我试过使用DISTINCT,但也不起作用


任何提供的帮助都不确定如何使用DISTINCT(显示查询),但也可以这样做:

SELECT * 
FROM messages 
WHERE from_user = '$this_user' OR 
      to_user = '$this_user' 

使用
UNION ALL

SELECT * FROM messages 
   WHERE from_user = '$this_user' OR to_user = '$this_user'
   GROUP BY `id`
试试这个

SELECT 'From You' type, * FROM messages m WHERE from_user = '$this_user'
UNION ALL
SELECT 'To You', * FROM messages m WHERE to_user = '$this_user'

您肯定需要利用
主题id
列上的分组吗? 使用如下查询:

select least(from_user, to_user) as x, greatest(from_user, to_user) as y
from   tableName
WHERE  from_user = '$this_user' OR to_user = '$this_user'
group by x, y

给我你想要的结果。请参阅此示例。

如果主题与此处无关,您希望如何准确显示“不同的消息”
id
似乎是一个代理键,所以
distinct topic
似乎是一个合理的赌注?你到底想要什么?登录用户与之通信的用户列表?或者主题列表以及登录用户就这些主题与之通信的人?@StuartL 1登录用户和其他用户之间的对话将是$this_user+其他用户id。因此我需要选择这种类型的对话,我将只获取消息和其他用户的计数ID@zarkoz我认为您需要使用
least
maxist
函数,GROUP BY是不相关的,因为从名称和数据来看,
id
列是唯一的键。但它们不是重复的。如果用户A向B发送两次消息,则这是两条单独的消息。因此,基本上你做得不对-如果你想处理线程,你应该将所有消息分组到线程中,并从线程而不是消息中进行选择。@PatrickJamesMcDougle-是的,这不会删除重复项,如果存在重复项,也不应该删除。因为用户收到的任何消息都不应该与用户发送的任何消息重复。两个都应该显示。是的,我试过了,它显示了用户参与的所有消息(登录用户)@zarkoz-这不是你要找的吗???@MahmoudGamal这拾取->4-5,5-4,这是相同的对话。@zarkoz它们不一样,因为第一个来自用户4,而第二个来自用户4。看看我最新的答案。不客气,兄弟!顺便提一下
SELECT * FROM messages
WHERE from_user = '$this_user' OR to_user = '$this_user'
GROUP BY `topic_id`