选择数据的SQL问题

时间:2014-01-02 21:32:12

标签: mysql sql

所以我有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})这是语言 过滤。

  • 如果它是空的我只想要执行上面的查询。 (或者至少产生相同的结果。)

  • 如果它有内容:

    • 我想通过查找最后一个表(lang)中的关系进行过滤,

 ...
 AND City.name LIKE '{3}%'
 AND Employee.id = EmpLang.eid
 AND EmpLang.lid = Lang.id
 AND Lang.desc LIKE '{4}%'
  • 如果这个人知道2个lang,我也不希望它显示两次结果。因此,如果此人知道英语和Eduardian并且过滤器为'e%',我只想显示一次结果。

我想在mysql中完全这样做。

3 个答案:

答案 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}%'