获取与表b匹配的表格的所有行

时间:2012-04-18 13:36:40

标签: mysql

我有两个包含人员数据,名字,姓氏等的表格。

第一个表包含我想要选择的数据,如果它与第二个表中的内容匹配。问题是第一个表可能只有第一个名称的首字母。

我尝试过以下查询的变体,但显然我遗漏了一些东西。我不介意表1中的“J Bloggs”和“Joe Bloggs”是否与表2中的“Joe Bloggs”匹配,这很好。

SELECT t1.* ,  LEFT(t2.FIRST_NAME, 1) AS firstChar 
FROM t1, t2
WHERE t1.surname = t2.LAST_NAME
AND t1.firstname  = t2.FIRST_NAME
OR t1.firstname  = t2.firstChar
GROUP BY t1.surname

2 个答案:

答案 0 :(得分:1)

您需要将()置于第二个WHERE条件周围,如下所示:

SELECT t1.* ,  LEFT(t2.FIRST_NAME, 1) AS firstChar 
FROM t1, t2
WHERE 
  t1.surname = t2.LAST_NAME
  AND (t1.firstname  = t2.FIRST_NAME OR t1.firstname  = LEFT(t2.FIRST_NAME, 1)
ORDER BY t1.surname

但是,不建议使用隐式连接语法。相反,使用

SELECT t1.* ,  LEFT(t2.FIRST_NAME, 1) AS firstChar 
FROM 
  t1 JOIN t2 
    ON t1.surname = t2.LAST_NAME
      AND (t1.firstname  = t2.FIRST_NAME OR t1.firstname  = LEFT(t2.FIRST_NAME, 1)
ORDER BY t1.surname

由于您的条件是姓氏必须匹配,并且第一个名称必须完全匹配或匹配第一个字符,因此必须将第一个名称条件分组到()内。

我还将GROUP BY替换为ORDER BY,因为您没有执行任何群组汇总功能(SUM(), COUNT(), AVG())。 MySQL不允许在WHERE子句中使用别名,因此我已将t2.firstChar替换为LEFT(t2.firstChar, 1)

最后,您可能会发现需要在联接的两侧使用UPPER()LOWER()转换所有名称的大小写,以确保它与大小写可能不一致的位置匹配。

答案 1 :(得分:0)

首先,您需要在WHERE子句中使用括号。其次,我不认为你会得到t2.firstChar的任何内容,除非你真的在表t2中有一个名为'firstChar'的列。在SELECT中指定它不会使其成为表中的实际行。相反,我认为你正在寻找更像这样的东西:

SELECT DISTINCT t1.*
FROM
    t1
    INNER JOIN t2 ON
        t1.surname = t2.LAST_NAME
        AND (
            t1.firstname = t2.FIRST_NAME
            OR t1.firstname = LEFT(t2.FIRST_NAME, 1)
        )