2015-03-25 2 views
0

В общем, все, что мне нужно сделать, это заказать таблицу MySQL. Но это должен быть «умный» заказ, и я хотел бы услышать ваши мнения.Динамический порядок MySQL

Существует таблица customers

id, name, email, phone, country, language, registration_time 

Существует еще одна таблица, которая содержит skills менеджеров по продажам, как числовые значения -

sales_manager_id, skill_type, skill_name, skill_value 
       7, language , English , 5 

Это означает, что менеджер номер 7 говорит по-английски на уровне 5 Каждый менеджер по продажам может иметь несколько навыков.

Теперь я хочу заказать таблицу клиентов страны, языка и registration_time (в этом точном порядке) для конкретного менеджера по продажам таким образом, чтобы верхние строки были из страны, в которой этот менеджер по продажам имеет высшие навыки, после этого языком, на котором он обладает высшими навыками, и после этого по времени регистрации.

Есть ли у вас какие-либо предложения? Самая большая проблема заключается в том, что этот запрос должен быть как можно более простым и читаемым, потому что в будущем будут изменения и я не хочу иметь дело с огромными запросами.

+2

Добавьте некоторые выборочные данные, и показать нам результат вы ожидаете! – jarlh

ответ

0

Я предполагаю, что понимаю вашу проблему. Если нет, пожалуйста, поправьте меня, иначе вот мое решение.

Я сделал несколько изменений в ваши рабочих таблицы для того, чтобы проверить запрос, и вы можете проверить мое решение, как я сделал здесь: SQL Fiddle

(1) Вы должны JOIN свой customers стола в два раза с skills стола - первое для country мастерства и второй для language мастерства менеджера по продажам:

select * 
from customers 
join skills as country_skills on country_skills.skill_name = customers.country 
join skills as language_skills on language_skills.skill_name = customers.language 

(2) вы должны ограничить результаты для только менеджера по продажам вы хотите, например, менеджер по продажам с id = 11:

where country_skills.sales_manager_id = 11 
and language_skills.sales_manager_id = 11 

(3) 'динамический' заказ вы хотите:

order by country_skills.skill_value desc, language_skills.skill_value desc, regTime desc 

Это будет мой полный запрос:

select * 
from customers 
join skills as country_skills on country_skills.skill_name = customers.country 
join skills as language_skills on language_skills.skill_name = customers.language 
where country_skills.sales_manager_id = 11 
and language_skills.sales_manager_id = 11 
order by country_skills.skill_value desc, language_skills.skill_value desc, regTime desc 

Таким образом, вы получили все customers Сортировка по country навыков конкретного менеджера по продажам>language навыков специалиста по продажам>regTime от customer. Этот запрос игнорирует customers с country или language менеджера по продажам не получил навык ... вы можете избежать этого с LEFT JOIN

+0

WOW !!! это похоже на то, что я искал! :) Я хочу верить, что никаких крайних случаев не будет. Большое спасибо! Genius! – darxysaq

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