SQL搜索关系

时间:2015-05-08 07:24:10

标签: mysql sql database join

我有一个有两个关系的主表。

数据结构和示例:

vector

我需要一个显示主表结果的查询,并在关系表中搜索关键字。

  

搜索米勒 - >迈克米勒,丽莎米勒   搜索SQL - >迈克米勒   搜索德语 - >迈克米勒

主表中有10,000行,关系为100.000。 我用A/Employee id fields 1 Mike Miller 2 Lisa Miller B/Skill aid name 1 SQL 1 PHP C/Language aid name 1 German 尝试过,但查询速度很慢。

当该行有多个关系时,主表中的同一行会多次显示一个视图:

  

搜索Miller
  回归:Mike Miller,Mike Miller

(Mike Miller不止一次展示)

JOIN

我尝试使用SELECT fields FROM A JOIN B ON id = B.aid JOIN C ON id = C.aid WHERE fields LIKE '%"+$search+"%' OR B.name LIKE '%"+$search+"%' OR C.name LIKE '%"+$search+"%'" 解决第二个问题,但现在没有显示没有关系的行。

我想一次显示主表中的每一行。我需要哪个查询?

2 个答案:

答案 0 :(得分:0)

使用LEFT JOIN

示例:

SELECT distinct e.empname FROM Employee e
LEFT JOIN skill s ON s.aid = e.id
LEFT JOIN lang l ON l.aid = e.id 
WHERE e.empname LIKE '%Miller%' OR s.name LIKE '%Miller%' OR l.name LIKE '%Miller%'

证明SQL Fiddle

答案 1 :(得分:0)

正如您自己提到的,您的第一个查询的问题是您返回了多个重复的行。不奇怪,因为我猜表A和表B&表之间的关系。 C是一对多

在您的下一次尝试中,您添加了 DISTINCT ,这确实会删除重复项,但常规的 join (或内部联接)只返回数据匹配可以连接,即两个连接表中都存在数据。

介绍LEFT JOIN

SELECT DISTINCT fields 
FROM A 
LEFT JOIN B ON id = B.aid 
LEFT JOIN C ON id = C.aid 
WHERE fields LIKE '%"+$search+"%' OR B.name LIKE '%"+$search+"%' OR C.name LIKE '%"+$search+"%'"

这将始终搜索表A中的所有数据,以及表B和表中的​​数据。 C可以在哪里进行连接。 DISTINCT将确保仅返回唯一的行。您也可以使用GROUP BY获得相同的结果,但这通常用于聚合方法。