2014-10-23 3 views
0

Это довольно специфична:Как присоединиться к таблицам, чтобы вернуть определенное количество людей в команде, которые соответствуют определенным критериям?

У меня есть две таблицы (t1 и t2) - t1 мой все лица стол, где все в моей базе данных, и все их данные хранятся, и t2 это мой гораздо меньше стол людей, которые на самом деле собираются сделать работу с людьми в t1.

Как вы можете видеть в этом образце SQL Fiddle, люди в t1 у каждого есть определенные критерии, возложенные на них (возраст, рейтинг, и команды). Мой конечный результат, мы надеемся, будет следующим: для каждого работника в t2 запрос вернет конкретных людей от t1, если их команды совпадают (идея в том, что я сопоставляю работников t2 с тем, re поговорить с в t1 основанный на их команде).

Но что делает его сложнее, что есть еще два набора критериев, которые я хочу запрос, чтобы удовлетворить также:

  1. возвращают только люди из t1, если их возраст находится в пределах от 30 до 60 лет (каждый вне из тех возрастных диапазонов следует игнорировать) -
  2. И Если есть более двух человек, которые соответствуют вышеуказанным критериям, сначала верните те, у кого лучший рейтинг. (Например, если в команде четыре человека, и нам нужно только два - так что запрос должен вернуть два с лучшими рейтингами, которые будут соответствовать тем, какие рейтинги ближе к 100.)

Последняя вещь что трудно оборачивать голову, так это то, что в команде есть несколько сотрудников. Так что, если в команде «A» есть два рабочих места , запрос должен вернуть четыре человека t1 в команде A: два прикреплены к одному работнику и два прикреплены к другому (и, как я сказал выше, они должны быть четырьмя лучшими оцененными людьми [хотя неважно, какие два человека идут к тому, кто работает).

Мой надежды выход будет выглядеть следующим для всех команд:

ID (t1) Person (t1) Team (t1) Worker (t2) 
539184 Smith, Jane Team A  Smith, Bob 
539186 Smith, Jim Team A  Smith, Bob 
537141 Smith, Danny Team A  Smith, Bill 
537162 Smith, James Team A  Smith, Bill 
Etc. 

В действительности, я делаю что-то похожее на это десятки тысяч записей - именно поэтому это единственный как я могу себе это представить, но я даже не знаю, с чего начать. Любая помощь будет принята с благодарностью, и я добавлю дополнительную информацию, которая была бы полезной!

ответ

0

Сценарий SQL не работает. Но все-таки идти вперед с форматом запроса :)

SET @rank:=1, @curr = 0;  

SELECT * FROM(
SELECT @rank := if(@curr = t1.id, @rank+1, 1) as rank,@curr := t1.id as curr, <field_list> 
FROM t1 
INNER JOIN t2 on t1.id = t2.ref_id 
WHERE t2.age BETWEEN 30 AND 60 < AND "whatever"> 
ORDER BY t1.id, t2.ranking desc 
) t WHERE rank <= 2 ; 

заменить полей, которые вы хотите выбрать, как имя, идентификатор, пол < И «все»> заменить все условия у вас есть как «рейтинг> 10» и т.д.

+0

Вот обновленный скрипт SQL (http://www.sqlfiddle.com/#!2/eda85/7) с тем, как я попытался заставить ваш запрос работать. Я удалил «», потому что я не знал, что это делает, а также «<И» независимо от того, что «>», и зафиксировал некоторые свопы t1/t2. Способ написания кода в скрипте возвращает нулевые записи, но не дает ошибок.Вероятно, часть проблемы связана с вашими идентификаторами 't1' и' t2', но работники из 't2' могут не обязательно находиться в таблице' t1' people. Любые другие идеи? Благодаря! – Ryan

+0

Спасибо за редактирование, но это все еще кажется неработоспособным - если у вас есть шанс перепрыгнуть в SQL Fiddle в комментарии выше и снять что-то назад, это было бы здорово. – Ryan

+0

Пожалуйста, попробуйте понять запрос. Как вы связываете эти две таблицы? t1.id = t2.id ничего не соответствует. Не проблема с логикой запроса, внесите необходимые изменения для себя. Когда я присоединился к «t1.LastName = t2.LastName», он дает вывод – georgecj11

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

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