mysql - 如何在不同连接MySQL时使用条件进行计数?

标签 mysql

我有两个表:

mysql> DESCRIBE swaps;
+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| id          | int(11)  | NO   | PRI | NULL    | auto_increment |
| user1_id    | int(11)  | NO   |     | NULL    |                |
| user2_id    | int(11)  | NO   |     | NULL    |                |
| hasto       | int(11)  | NO   |     | NULL    |                |
| requested   | datetime | NO   |     | NULL    |                |
| accepted    | datetime | YES  |     | NULL    |                |
| swapped1    | datetime | YES  |     | NULL    |                |
| swapped2    | datetime | YES  |     | NULL    |                |
| rejected    | datetime | YES  |     | NULL    |                |
| rejected_by | int(11)  | YES  |     | NULL    |                |
+-------------+----------+------+-----+---------+----------------+
mysql> DESCRIBE messages;
+-----------+----------+------+-----+-------------------+----------------+
| Field     | Type     | Null | Key | Default           | Extra          |
+-----------+----------+------+-----+-------------------+----------------+
| msg_id    | int(11)  | NO   | PRI | NULL              | auto_increment |
| sender_id | int(11)  | NO   |     | NULL              |                |
| msg       | text     | NO   |     | NULL              |                |
| msg_time  | datetime | NO   |     | CURRENT_TIMESTAMP |                |
| swap_id   | int(11)  | NO   |     | NULL              |                |
| seen      | datetime | YES  |     | NULL              |                |
+-----------+----------+------+-----+-------------------+----------------+

以及我从 this 调整的查询问题

SELECT s.*, m.*
FROM swaps as s
JOIN messages as m
ON (s.id= m.swap_id AND m.msg_time=
  (SELECT MAX(msg_time) FROM messages WHERE messages.swap_id = s.id));

因此,我为每个交换以及有关此交换中最后发送的消息的信息设置了一行。我想添加尚未看到的消息的计数(m.seen IS NULL)。

我尝试了不同的方法,但总是出错。我想要的是将相应交换中看到的 IS NULL 的消息计数添加到我的结果集中。如有任何建议,将不胜感激。

最佳答案

您可以将计数添加为子查询:

SELECT s.*, m.*,
       (SELECT COUNT(*) FROM messages m2 WHERE m2.seen IS NULL) as seen_is_null
FROM swaps s JOIN
     messages m
     ON s.id= m.swap_id AND
        m.msg_time =(SELECT MAX(m2.msg_time) FROM messages m2 WHERE m2.swap_id = s.id));

所有消息进行计数似乎很奇怪,但这正是问题所要求的。当然,您可以引入关联子句来计算给定的交换或其他内容。

关于mysql - 如何在不同连接MySQL时使用条件进行计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41619705/

相关文章:

php - 如何检索只属于指定用户的数据?

php - 如何设置 IIS、MS SQL 服务器来显示我的 PHP 错误

mysql - 从数据库获取动态值到 Rails View

mysql - 在子日期之间的父日期之间加入自身

mysql - 我不向PDO数据查询收费,也不显示数据(显示为空白)

MySQL RAND() 不在特定列中重复值

php - 使用 PHP/AJAX 添加和更新数据库行

php - PHP和MySQL:如何结合UPDATE和SELECT(带有min函数)查询

php - 社交网络墙发布逻辑不起作用

mysql - VPS无法通过socket连接本地MySQL服务器