第二个表中最新状态= 1的mySQL记录

时间:2013-11-27 11:27:30

标签: mysql sql

我有桌子A

|    id    |    Name    |
_________________________
|    1     |    ABC     |
_________________________
|    2     |    BCD     |
_________________________

表B

|    id    |    a_id    |    Status    |    timestamp    |
__________________________________________________________
|    1     |    1       |       1      |    timestamp    |
__________________________________________________________
|    2     |    1       |       2      |    timestamp    |
__________________________________________________________
|    3     |    1       |       3      |    timestamp    |
__________________________________________________________
|    4     |    2       |       1      |    timestamp    |
__________________________________________________________

在上面的示例中,我只想选择

|    name  |    a_id    |    Status    |    timestamp    |
__________________________________________________________
|    BCD   |    2       |       1      |    timestamp    |

因此,对于任何只有最新状态为1的记录,我想选择该记录..如果最新状态为2或3,我不想要选择它们......

如果可能的话,我不想使用子查询,因为我使用的Codeigniter并不像子查询。

请帮忙

2 个答案:

答案 0 :(得分:1)

那将是:

SELECT
  A.name,
  B.*
FROM
    (SELECT 
       a_id, 
       MAX(`timestamp`) AS max_timestamp
     FROM B 
     GROUP BY a_id) AS latest
    LEFT JOIN B
      ON 
        B.a_id=latest.a_id
        AND
        B.`timestamp`=latest.max_timestamp
    LEFT JOIN A
      ON B.a_id=A.id
WHERE
  B.status=1

至于子查询 - 我怀疑你可以在单个查询中检索所需的信息。这是因为您需要使用行集,这是由一列分组的结果,引用另一列。因此,您需要先对其进行分组,然后将JOIN应用于结果行集。

答案 1 :(得分:1)

感谢@Strawberry指出这篇文章,我为这个例子找到了一种方法。

select a.name
      ,b1.a_id
      ,b1.status
      ,b1.`timestamp` AS b1Time
FROM TableA a
JOIN TableB b1 ON b1.a_id = a.id
LEFT JOIN TableB b2 ON b2.a_id = b1.a_id AND b1.`timestamp` < b2.`timestamp`
WHERE b2.`timestamp` IS NULL
AND b1.status = 1

请参阅此Fiddle