MySQL搜索所有表格

时间:2013-11-30 07:13:15

标签: mysql search

我有三张表employee, job_informationemergency_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

2 个答案:

答案 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子句添加了额外条件,允许详细信息表的idnull,表示存在没有该员工的详细信息。

答案 1 :(得分:0)

你可以尝试一下吗?我在SQLFiddle上测试过。你遗失了"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)
);