mysql - 获取表a中与表b匹配的所有行

标签 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

最佳答案

您需要将 () 放在第二个 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

由于您的条件是姓氏必须匹配,并且名字必须完全匹配或匹配第一个字符,因此名字条件必须在 ().

我还用 ORDER BY 替换了您的 GROUP BY,因为您没有执行任何组聚合函数(SUM()、COUNT()、AVG ())。 MySQL 不允许在 WHERE 子句中使用别名,因此我也将 t2.firstChar 替换为 LEFT(t2.firstChar, 1) .

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

关于mysql - 获取表a中与表b匹配的所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10210556/

相关文章:

javascript - 使用 PHP/Javascript 中的按钮动态生成 <div> 部分?

mysql - Rails - 连接表删除

Mysql ANY NOT EQUAL TO 子查询不工作

php - 将 .env 文件添加到 UserFrosting

mysql - 检索每个的唯一值和计数

mysql - 自用户上次看到后更改的标记/标记内容

javascript - php 脚本中 json 返回值的 ajax jquery 错误

mysql - SQL 查询长度的实际限制(特别是 MySQL)

php - MySQL Join 返回超过预期

php - 插入到 MYSQL 表中的值与原始值不同