左连接2表,仅返回第二个表上显示的记录

时间:2012-06-26 07:19:37

标签: mysql

我要加入2个表格(table1table2)。

第一个表包含每个记录的唯一globalcid,第二个表包含多个相同globalcid的出现。注意:globalcid是table2到table1的引用字段。

  

表1

globalcid  / itemdesc
1          / item 1
2          / item 2
3          / item 3
4          / item 4
5          / item 5
  

表2

globalcid    /  recordcid
1            / 1
1            / 2
2            / 1
3            / 1
3            / 2
3            / 3
5            / 1

我希望查询只返回[table1]中的记录,并在[table2] GROUP BY table2.globalcid中记录,但会返回每个globalcid的最后一条记录

在上面的示例中,它应该返回

globalcid  / itemdesc  / table2.globalcid
1          / item 1    / 2
2          / item 2    / 1
3          / item 3    / 3
5          / item 5    / 1

2 个答案:

答案 0 :(得分:3)

SELECT 
    a.*,
    MAX(b.recordcid) AS maxcid
FROM 
    table1 a
INNER JOIN 
    table2 b ON a.globalcid = b.globalcid
GROUP BY 
    a.globalcid

如果您只关心recordcid并且不需要该表中的任何其他列,那么这应该没问题。但是,如果表中有其他列如下:

globalcid    /  recordcid   /  othercolumn 
------------------------------------------
1            / 1            /  bertrand
1            / 2            /  centipede
2            / 1            /  yarn
3            / 1            /  obviate
3            / 2            /  hyper
3            / 3            /  fish
5            / 1            /  larry

...然后MAX()值不会与othercolumn中对应的行数据对齐,而是必须在子选择中包含max的选择,如下所示:

SELECT
    a.*,
    c.recordcid,
    c.othercolumn
FROM
    table1 a
INNER JOIN
    (
        SELECT globalcid, MAX(recordcid) AS maxcid
        FROM table2
        GROUP BY globalcid
    ) b ON a.globalcid = b.globalcid
INNER JOIN
    table2 c ON b.globalcid = c.globalcid AND b.maxcid = c.recordcid

导致:

globalcid    /  itemdesc    /  recordcid   /  othercolumn 
---------------------------------------------------------
1            /  item1       / 2            /  centipede
2            /  item2       / 1            /  yarn
3            /  item3       / 3            /  fish
5            /  item5       / 1            /  larry

答案 1 :(得分:1)

您应该能够使用内部联接和聚合来实现此目的:

SELECT table1.globalcid, itemdesc, MAX(recordcid)
FROM table1 INNER JOIN table2 on table1.globalcid = table2.globalcid
GROUP BY table1.globalcid, itemdesc

内部联接排除了 table1 table1 中没有匹配ID的所有记录。 MAX / GROUP BY将为每个 globalcid 提取 recordid 的最大值。