【问题标题】:How to use 'ORDER BY' statement in a 'SELECT DISTINCT CASE WHEN' statement in sql & php?如何在 sql & php 的“SELECT DISTINCT CASE WHEN”语句中使用“ORDER BY”语句?
【发布时间】:2019-10-20 06:44:14
【问题描述】:

我正在尝试创建一个聊天应用程序,并且目前正在列出当前用户进行的对话。
这是我的 SQL 表:(这里 29 是当前用户)

ID   |  FROM_USER  |  TO_USER  |  MESSAGE      
------------------------------------------------------------
1    |  16         |  29       |  Hey!         
2    |  29         |  18       | Hii..         
3    |  29         |  16       | What's up?
4    |  18         |  29       | Long time no see..

我要做的是按降序对对话进行分组,例如:

18: Long time no see...
29 (to 16) : What's up?

我目前使用的php代码如下:


$query = mysqli_query($con,"SELECT DISTINCT CASE WHEN from_user = 29 THEN to_user ELSE from_user END as other_user FROM mytable WHERE from_user = 29 OR to_user = 29 ORDER BY id DESC");
while($fetch = mysqli_fetch_array($query)) {
$user = $fetch['other_user'];
echo $user.'<br/>';
}

但这似乎不起作用。我究竟做错了什么?
提前致谢!

【问题讨论】:

  • 现在的结果是什么
  • 为了与用户 29 进行对话,SELECT * FROM mytable WHERE from_user = 29 OR to_user = 29 ORDER BY id DESC 不就是你想要的吗?
  • 您能否包含完整的 4 条记录预期输出?
  • 结果有时如预期的那样。其他时候它会以另一种方式出现。

标签: php mysql sql chat


【解决方案1】:

这是你的代码:

SELECT DISTINCT CASE WHEN from_user = 29 THEN to_user ELSE from_user END as other_user
FROM mytable
WHERE from_user = 29 OR to_user = 29
ORDER BY id DESC;

未定义列id,因为它不在distinct 中。我猜你不希望它在那里,因为SELECT DISTINCT 会返回重复的other_users。

我会推荐聚合而不是DISTINCT。 MySQL 使这很容易,因为您可以在 GROUP BY: 中使用列别名:

SELECT (CASE WHEN from_user = 29 THEN to_user ELSE from_user END) as other_user
FROM mytable
WHERE 29 IN (from_user, to_user)
GROUP BY other_user
ORDER BY MAX(id) DESC;

这将按新近度顺序(或至少基于id 列的新近度)返回其他用户。

【讨论】:

  • 感谢您的努力,先生!
  • 先生,您的陈述似乎有误...它只显示了我发消息给我的用户,而不显示给我发消息的用户。如何解决这个问题?
  • @MuhammedRanshidAsif 。 . .我修复了一个剪切和粘贴错误。
  • 谢谢,先生。很高兴你回复了。
猜你喜欢
  • 2017-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-20
相关资源
最近更新 更多