Mysql 从两个联接表中选择具有最新日期且不重复的行?
我有A桌和B桌 表A有如下数据Mysql 从两个联接表中选择具有最新日期且不重复的行?,mysql,Mysql,我有A桌和B桌 表A有如下数据 | id | status | made at | ... | | 1 | new |14-04-14 | ... | | 2 | fixed |14-08-12 | ... | | 3 | fixed |14-03-15 | ... | | ... | ... | .. | ... | 在表B中 | id | A_id | chang
| id | status | made at | ... |
| 1 | new |14-04-14 | ... |
| 2 | fixed |14-08-12 | ... |
| 3 | fixed |14-03-15 | ... |
| ... | ... | .. | ... |
在表B中
| id | A_id | changes |changed at| ... |
| 1 | 1 | new | 14-04-14 | ... |
| 2 | 2 | new | 14-08-12 | ... |
| 3 | 2 | fixed | 14-08-28 | ... |
| 4 | 3 | new | 14-03-15 | ... |
| 5 | 3 | fixed | 14-05-11 | ... |
| 6 | 3 | fixed | 14-05-14 | ... |
| .. | .. | .. | .. | ... |
我想要的结果是选择表A中的固定状态和表B中的固定更改,不重复
如果它有相同的更改
,比如B中的5和6,我将只选择最新更改的数据
所以结果看起来像
| id | A_id | made at | status | changes | changed at | ... |
| 2 | 2 | 14-08-12 | fixed | fixed | 14-08-28 | ... |
| 3 | 3 | 14-03-15 | fixed | fixed | 14-05-14 | ... |
我尝试了从A,B中选择*,其中(A.status='fixed')和(A.id=B.A_id)以及(B.changes='fixed')
,但仍然有重复导致更改
如何才能使查询正确?我认为您共享的示例输出不正确,id列的值应该是
3
和6
,而不是2
和3
。无论如何,试试这个
SELECT b3.id, a.id AS 'A_id', a.made_at AS 'made at', a.status, b3.changes, b3.changed_at AS 'changed at'
FROM
a
INNER JOIN (
SELECT b1.id, b1.A_id, b1.changes, b1.changed_at FROM b AS b1
INNER JOIN
(SELECT A_id, MAX(changed_at) AS changed_at FROM b WHERE changes='fixed' GROUP BY 1) AS b2 ON b1.A_id=b2.A_id AND b1.changed_at=b2.changed_at
) b3 ON a.id=b3.A_id
WHERE
a.status = 'fixed'
我认为您共享的示例输出不正确,id列应该有值
3
和6
,而不是2
和3
。无论如何,试试这个
SELECT b3.id, a.id AS 'A_id', a.made_at AS 'made at', a.status, b3.changes, b3.changed_at AS 'changed at'
FROM
a
INNER JOIN (
SELECT b1.id, b1.A_id, b1.changes, b1.changed_at FROM b AS b1
INNER JOIN
(SELECT A_id, MAX(changed_at) AS changed_at FROM b WHERE changes='fixed' GROUP BY 1) AS b2 ON b1.A_id=b2.A_id AND b1.changed_at=b2.changed_at
) b3 ON a.id=b3.A_id
WHERE
a.status = 'fixed'
请尝试此查询
SELECT tab.* FROM(SELECT A.*,B.A_id,B.chnages,B.changed at
FROM A LEFT JOIN B ON A.id=B.A_id
WHERE A.status='fixed' AND B.changes ='fixed'
ORDER BY B.changes_at DESC ) as tab GROUP BY tab.id
请尝试此查询
SELECT tab.* FROM(SELECT A.*,B.A_id,B.chnages,B.changed at
FROM A LEFT JOIN B ON A.id=B.A_id
WHERE A.status='fixed' AND B.changes ='fixed'
ORDER BY B.changes_at DESC ) as tab GROUP BY tab.id
请尝试此查询
SELECT
a.id,
b.A_id,
a.status,
a.made_at,
b.changes,
b.changed_at
FROM
A a
INNER JOIN
B b ON b.A_id = a.id
WHERE
a.status = 'fixed'
AND
b.changes = 'fixed'
AND
b.changed_at = (select
MAX(b1.changed_at)
from
b b1
where
b1.changes = b.changes
and b1.A_id = b.A_id
)
请尝试此查询
SELECT
a.id,
b.A_id,
a.status,
a.made_at,
b.changes,
b.changed_at
FROM
A a
INNER JOIN
B b ON b.A_id = a.id
WHERE
a.status = 'fixed'
AND
b.changes = 'fixed'
AND
b.changed_at = (select
MAX(b1.changed_at)
from
b b1
where
b1.changes = b.changes
and b1.A_id = b.A_id
)
你的日期是日期,对吗?你的日期是日期,对吗?b1是什么?你所说的“tableA AS a”是什么意思?你不是说a和b是表名吗?@W.Cointreau,我以为a和b是表的别名,如果a和b是实际的表名,那么我已经更改了查询。b1、b2和b3是表b的别名(简称),用于区分多个用途感谢您的回答。我在问题中没有使用别名(实际上我不知道别名是什么,我是mysql的新手:'()这是真正的表名。b1是什么?你说的“表a是a”是什么意思?你不是说a和b是表名吗?@W.Cointreau,我以为a和b是你在表中使用的别名,如果a和b是你的实际表名,那么我已经更改了查询。b1、b2和b3是别名(简称)请参阅表b以区分多种用途谢谢你的回答。我的问题中没有使用别名(实际上我不知道别名是什么,我是mysql的新手:'()这是真实的表名。我尝试了这个。重复结果消失了,但更改的数据不是最新的,而是最旧的。这依赖于一个未记录的黑客(除非你计算手册相关页面的评论部分-我没有!)我试过了。重复结果消失了,但更改的数据不是最新的,而是最旧的。这依赖于未记录的黑客攻击(除非你计算手册相关页面的评论部分-我不!)