我有一个有两个关系的主表。
数据结构和示例:
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+"%'"
解决第二个问题,但现在没有显示没有关系的行。
我想一次显示主表中的每一行。我需要哪个查询?
答案 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%'
答案 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获得相同的结果,但这通常用于聚合方法。