我有三张表employee, job_information
和emergency_contact
。由于引擎兼容性问题,我无法执行FULL TEXT
搜索。所以,我正在尝试FULL TEXT
使用以下查询进行搜索。但我正在重复专栏。这是我的Fiddle
查询是,
SELECT E.id, E.name, E.email, J.title, J.location
FROM employee E, job_information J, emergency_contact C
WHERE (E.id LIKE '%kavi%')
OR (E.name LIKE '%kavi%')
OR (E.email LIKE '%kavi%')
OR (J.title LIKE '%kavi%')
OR (J.location LIKE '%kavi%')
OR (C.earea LIKE '%kavin%')
OR (C.ephone LIKE '%kavi')
预期结果是,
ID NAME EMAIL TITLE LOCATION
3 kavi abd2ab lead bangalore
4 kavi abd2ab lead bangalore
答案 0 :(得分:3)
那是因为您只是将所有这些表以逗号分隔列出,没有任何连接条件:
FROM employee E, job_information J, emergency_contact C
这基本上执行交叉连接,返回所有数据的笛卡尔积。
这应该这样做,也就是说,如果每个id具有相同的含义,即员工ID。我建议看看你的命名,因为' id'过于通用的名称可以像这样使用。随着数据库的增长,您将拥有各种不同含义的ID。
SELECT E.id, E.name, E.email, J.title, J.location
FROM
employee E
inner join job_information J on J.id = E.id
inner join emergency_contact C on C.id = E.id
WHERE
(E.id LIKE '%kavi%') OR
(E.name LIKE '%kavi%') OR
(E.email LIKE '%kavi%') OR
(J.title LIKE '%kavi%') OR
(J.location LIKE '%kavi%') OR
(C.earea LIKE '%kavi%') OR
(C.ephone LIKE '%kavi')
如果您的员工可能没有job_information或emergency_contact(当然可能会发生),您可以使用左连接而不是内连接。
例如,如果您删除了员工3的job_information,您将只看到上述查询返回的员工4,即使员工3仍然匹配过滤器' kavi'。要解决此问题,请使用以下查询:
http://sqlfiddle.com/#!2/4166ae/3
SELECT E.id, E.name, E.email, J.title, J.location
FROM
employee E
LEFT JOIN job_information J on J.id = E.id
LEFT JOIN emergency_contact C on C.id = E.id
WHERE
E.id LIKE '%kavi%' OR
E.name LIKE '%kavi%' OR
E.email LIKE '%kavi%' OR
J.id IS NULL OR
J.title LIKE '%kavi%' OR
J.location LIKE '%kavi%' OR
C.id IS NULL OR
C.earea LIKE '%kavi%' OR
C.ephone LIKE '%kavi'
它基本上将inner join
更改为left join
,并为where子句添加了额外条件,允许详细信息表的id
为null
,表示存在没有该员工的详细信息。
答案 1 :(得分:0)
"JOIN Condition"
SELECT E.id, E.name, E.email, J.title, J.location
FROM employee E JOIN job_information J ON E.id = J.id
JOIN emergency_contact C ON J.id = C.id
WHERE (E.id LIKE '%kavi%')
OR (E.name LIKE '%kavi%')
OR (E.email LIKE '%kavi%')
OR (J.title LIKE '%kavi%')
OR (J.location LIKE '%kavi%')
OR (C.earea LIKE '%kavin%')
OR (C.ephone LIKE '%kavi')
以上查询效果很好,但我强烈建议您的数据库设计应如下所示。根据sqlFiddle,表之间存在一对一的关系。
CREATE TABLE employee(
eid INT(5) NOT NULL PRIMARY KEY,
name VARCHAR(10),
email VARCHAR(10),
job_title VARCHAR(10),
job_location VARCHAR(10),
earea VARCHAR(6),
ephone VARCHAR(10)
);