我有桌子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并不像子查询。
请帮忙
答案 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。