所以我有6张桌子。
Company (1..1) --- (0..n) District
District (1..1) --- (0..n) City
City (1..1) --- (0..n) Employee
在n关系上有很多1开始。
然后我有1 n..n关系实现如下:
Employee (1..1) --- (0..n) EmpLang
EmpLang (0..n) --- (1..1) Lang
现在我选择像这样的员工:
SELECT Employee.Name, Employee.lastName, Employee.PhoneNumber
FROM Company, District, Employee, EmpLang, Lang
WHERE Company.id = District.cid
AND District.id = City.did
AND City.id = Employee.id
AND Company.name LIKE '{1}%'
AND District.name LIKE '{2}%'
AND City.name LIKE '{3}%'
{1}, {2}, {3}
:一些随机变量(不重要)
我的问题是我有另一个变量({4}
)这是语言
过滤。
如果它是空的我只想要执行上面的查询。 (或者至少产生相同的结果。)
如果它有内容:
...
AND City.name LIKE '{3}%'
AND Employee.id = EmpLang.eid
AND EmpLang.lid = Lang.id
AND Lang.desc LIKE '{4}%'
我想在mysql中完全这样做。
答案 0 :(得分:1)
使用子查询进行处理。在where语句中,您可以在(选择...)
中执行employee.id这里的select语句将选择符合该语言的所有employee_id。
where ...
and employeeid in (select employeeID
from employee
left join Emplang on Employee.id = EmpLang.eid
left join land on EmpLang.lid = Lang.id
where Lang.desc LIKE '{4}%')
(我改变了你的语法,你把连接放在where子句中...它是较旧的SQL,我在这里写的连接方法更容易理解。
要处理空语言,请在语句中包含一个或更多。
and (employee id in (select...) or 1 = case when {4} is null then 1 else 0 end)
答案 1 :(得分:0)
我认为在这种情况下你可能想看看做一个连接。如果您在此链接中不熟悉联接,可以了解有关联接的更多信息:http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
编辑:我现在无法发布代码(在工作中),但如果我回家时没有其他人做出回应,我会对此进行修改。答案 2 :(得分:-2)
您应该在查询中使用distinct来仅返回一次值。
SELECT DISTINCT Employee.Name, Employee.lastName, Employee.PhoneNumber
FROM Company, District, Employee, EmpLang, Lang
WHERE Company.id = District.cid
AND District.id = City.did
AND City.id = Employee.id
AND Company.name LIKE '{1}%'
AND District.name LIKE '{2}%'
AND City.name LIKE '{3}%'
AND Employee.id = EmpLang.eid
AND EmpLang.lid = Lang.id
AND Lang.desc LIKE '{4}%'