2014-01-02 3 views
0

Итак, у меня есть 6 таблиц.Вопрос Sql с выбором данных

Company (1..1) --- (0..n) District 
District (1..1) --- (0..n) City 
City  (1..1) --- (0..n) Employee 

Так много от 1 до n отношений, чтобы начать.

Тогда я 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}%' 
  • Кроме того, я не хочу для отображения результатов дважды, если человек знает 2 lang's. Поэтому, если человек знает английский и эдуардский, а фильтр «e%», я хочу только один раз отобразить результат.

Я хотел бы сделать это исключительно в mysql.

+0

Пожалуйста, разместите данные реальных образцов и результат выборки. Если человек знает> 1 'Lang', но вам нужен только один результат, какой он должен быть? –

+0

Wel, если языковой фильтр, например: 'e%', и человек знает английский и эдуардский, я просто хотел бы снова подтвердить SELECT Employee.name, Employee.lastName, Employee.phoneNumber. К сожалению, я не могу, потому что не могу придумать способ написать этот код :( – user3152069

+0

О, ну, в приведенном выше описании вы должны удалить 'EmpLang, Lang' из списка SELECT, если вы действительно не хотите они в результатах. –

ответ

1

Подход к нему с подзапросом. В вашем заявлении where вы можете сделать where employee.id in (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}%') 

(я изменил синтаксис на вас, вы ставите стыки в где п ... он старше SQL, метод, который я написал здесь легче следовать присоединиться.

Для обработки языка нулевой , оберните или вне справки.

and (employee id in (select...) or 1 = case when {4} is null then 1 else 0 end) 
+0

Дайте мне знать, если это имеет смысл, я надеюсь, что буду использовать английский лучше. ;) – Twelfth

+0

Да это было :). Извините, мой английский isen't так хорошо, это в основном интернет-английский xP. – user3152069

+0

Я бы дал вам +1, если бы вы могли опубликовать версию, в которой вы избавитесь от старого синтаксиса соединения. – Zane

0

Я думаю, что в этом случае вы можете захотеть посмотреть на соединение. Вы можете узнать больше о объединениях, если вы с ними не знакомы по этой ссылке: http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

EDIT: Я не могу опубликовать код сейчас (на работе), но если никто еще не ответил, когда я возвращаюсь домой, Будем взламывать.

+0

Я пробовал использовать соединение, я лихорадочно трачу часы, просто смотрю на экран Мне нужно, чтобы кто-нибудь разместил здесь код, если это возможно. – user3152069

+0

@ mkross1983 - он использует более старый синтаксис, соединения удерживаются в его предложении where. – Twelfth

+0

@ mkross1983 Возможно, вы не знаете об этом факте, так как они ушли с этим стилем 'JOIN' 22 года назад! – Zane

-2

Вы должны использовать отдельный запрос, чтобы возвращать значения только один раз.

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}%' 
+0

Не устраняет основную причину проблемы. Вы не можете просто бросить 'DISTINCT' перед всеми вашими проблемами. – Zane

Смежные вопросы