Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从两个联接表中选择具有最新日期且不重复的行?_Mysql - Fatal编程技术网

Mysql 从两个联接表中选择具有最新日期且不重复的行?

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

我有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   |    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的新手:'()这是真实的表名。我尝试了这个。重复结果消失了,但更改的数据不是最新的,而是最旧的。这依赖于一个未记录的黑客(除非你计算手册相关页面的评论部分-我没有!)我试过了。重复结果消失了,但更改的数据不是最新的,而是最旧的。这依赖于未记录的黑客攻击(除非你计算手册相关页面的评论部分-我不!)