【问题标题】:MySQL join statement returns only one joint recordMySQL join 语句只返回一个联合记录
【发布时间】:2016-03-07 23:09:40
【问题描述】:

我要两张桌子:

请求:

+----+------+----+
| id | from | to |
+----+------+----+
|  1 | aaaa | aa |
+----+------+----+
|  2 | aaab | ab |
+----+------+----+
|  3 | aabb | bb |
+----+------+----+

请求状态

+----+--------+---------+---------+
| id | req_id |  status |  time   |
+----+--------+---------+---------+
|  1 |    1   | pending |  mm-dd  |
+----+--------+---------+---------+
|  2 |    1   | sent    |  mm-dd  |
+----+--------+---------+---------+
|  3 |    2   | pending |  mm-dd  |
+----+--------+---------+---------+
|  2 |    2   | failed  |  mm-dd  |
+----+--------+---------+---------+
|  4 |    3   | pending |  mm-dd  |
+----+--------+---------+---------+

在请求表上我必须记录:中间状态和完成请求状态。

我需要的是某种连接语句,每个请求只返回一个状态,但只有在失败或发送不存在时才返回挂起状态。

结果:

+----+------+----+---------+
| id | from | to | status  |
+----+------+----+---------+
|  1 | aaaa | aa | sent    |
+----+------+----+---------+
|  2 | aaab | ab | failed  |
+----+------+----+---------+
|  3 | aabb | bb | pending |
+----+------+----+---------+

select r.id, r.from, r.to, s.status  from requests r
join request_status s on r.id = s.req_status
where r.status not like 'pending'

将返回而没有挂起状态。

【问题讨论】:

  • 数据和查询不正确。您是否测试过您发布的查询?上面的数据最好提供DDL和DML语句,post查询经过测试。
  • 有一些可能性,但是你的逻辑是如何工作的,是否有应用规则,无论何时发送请求,都无法再使用该 request_id 插入数据?
  • 为什么你的 request_status id 不是唯一的?

标签: mysql join


【解决方案1】:

您似乎正在尝试显示与request_status最近对应行的request 的每一行。

为了使其正常工作,您的request_status.id 列需要是主键并且需要自动递增。也就是说,request_status 中的每个新行都必须具有更高的值id。这就是我们如何判断哪一行比另一行更新的方式。

然后,这很容易。此子查询产生一组最新的id 值。 (http://sqlfiddle.com/#!9/c845b/1/0)

        SELECT MAX(id) latest_id
          FROM request_status
         GROUP BY req_id

然后您在连接中使用子查询如下 (http://sqlfiddle.com/#!9/c845b/3/0)

SELECT r.id, r.from, r.to, s.status
  FROM request r
  JOIN request_status s ON r.id = s.req_id
  JOIN (
            SELECT MAX(id) latest_id
              FROM request_status
             GROUP BY req_id
        ) t ON s.id = t.latest_id

第三次JOIN操作基本等价于

 WHERE s.id IN (
        SELECT MAX(id) latest_id
          FROM request_status
         GROUP BY req_id
       )

它会过滤掉每个请求 id 的除最新状态行之外的所有状态行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    相关资源
    最近更新 更多