如何在 sql 和 php 中的 'SELECT DISTINCT CASE WHEN' 语句中使用 'ORDER BY' 语句?
How to use 'ORDER BY' statement in a 'SELECT DISTINCT CASE WHEN' statement in sql & php?
我正在尝试创建一个聊天应用程序,目前正在列出当前用户进行的对话。
这是我的SQLTable:(这里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/>';
}
但这似乎不起作用。我究竟做错了什么?
提前致谢!
这是您的代码:
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
会 return 重复 other_user
s.
我建议聚合而不是 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;
这将 return 其他用户按新近度排序(或至少基于 id
列的新近度)。
我正在尝试创建一个聊天应用程序,目前正在列出当前用户进行的对话。
这是我的SQLTable:(这里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/>';
}
但这似乎不起作用。我究竟做错了什么?
提前致谢!
这是您的代码:
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
会 return 重复 other_user
s.
我建议聚合而不是 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;
这将 return 其他用户按新近度排序(或至少基于 id
列的新近度)。