想象一下,我有两个表:用户和学生
每个表都有一个id和email列。我希望能够从两个表中搜索电子邮件。我可以加入ID匹配的两个表:
SELECT users.email,students.email as student_email FROM users
INNER JOIN students ON users.id = students.id
我无法搜索电子邮件列,因为它们具有相同的列名称(电子邮件)。因此,如果我尝试使用WHERE
,它会抱怨列(电子邮件)不明确。如果我尝试使用 student_email ,则会抱怨该列不存在。
如果两个表没有使用相同的列名(电子邮件),那么当我使用WHERE
时就可以了。
我能想到的唯一解决方案是获取所有行,然后循环它们并手动搜索电子邮件字符串。与使用MySQL相比,这是非常缓慢的:
SELECT users.email,students.email as student_email FROM users
INNER JOIN students ON users.id = students.id
WHERE email LIKE '%test@email.com%' OR student_email LIKE '%test@email.com%'
但当然这不起作用,因为WHERE
在SELECT
之前查找原始列名称。
如何在不获取所有行并循环的情况下解决这个问题?也许它是一个联盟,而不是JOIN
?我不确定......
答案 0 :(得分:4)
只需使用限定列名称即可。我还推荐表别名:
SELECT u.email, s.email as student_email
FROM users u INNER JOIN
students s
ON u.id = s.id
WHERE u.email LIKE '%test@email.com%' OR
s.email LIKE '%test@email.com%';
每当查询中有多个表时,您应始终限定所有列名。将表的缩写用作表别名使查询更容易编写和读取。