Упорядочить по n_ammounts соответствующих экземпляров в объединенной таблице - PullRequest
0 голосов
/ 16 апреля 2019

Я пишу программу для запроса к моей БД.У меня есть таблицы one_to_n tbl_user_service и tbl_user_competens

Учитывая, что два массива сыра отформатированы в строки, которые могут поместиться в предложение IN -> 'word ',' word_2 '... и т. д.

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

Мой запрос на данный момент выглядит следующим образом

 $sql = "SELECT DISTINCT tbl_users.*  FROM tbl_users 
 INNER JOIN tbl_user_service
    ON tbl_users.region = '$region'
    AND tbl_user_service.fld_service IN ($services_in)
 INNER JOIN tbl_user_competens
    ORDER BY FIELD(tbl_user_competens, $competens_in)
  ";

Полученные мной результаты верны, я ищу, как их отсортировать на основе совпаденийможно найти для данного user_id в tbl_user_competens

test_drive и требуемых результатах

Query_Data : 
Region : "Some_State"

Services : 'Webdevelopment', 'Some Service'
Competens : 'React JS', 'Native JS'

tbl_users:
  fld_user_id : 1    Region : "Some_State"
  fld_user_id : 2    Region : "Some_State"
  fld_user_id : 3    Region : "Some_State"

tbl_user_services :
  fld_user_id : 1  service : 'Webdevelopment'
  fld_user_id : 2  service : 'Webdevelopment'
  fld_user_id : 3  service : 'Webdevelopment'

tbl_user_competens :
  fld_user_id : 1  competens : 'React JS'
  fld_user_id : 1  competens : 'Native JS'
  fld_user_id : 2  competens :'React JS'

Результат должен быть

Пользователь 1, так как 2 совпадающих участникаПользователь 2 с 1 совпадением конкурирует Пользователь 3 с 0 совпадением конкурирует

1 Ответ

1 голос
/ 16 апреля 2019

Вместо того, чтобы присоединяться к таблице компонентов, присоединитесь к производной от нее таблице, выбрав для каждого идентификатора пользователя количество компонентов, которые у них соответствуют списку компонентов.
Кроме того, вместо использования distinct и присоединения ктаблица служб, используйте exists и коррелированный подзапрос.
Это позволит вам отсортировать результаты по столбцам, которых нет в предложении select.

SELECT u.fld_user_id, Region
FROM tbl_users As u
INNER JOIN
(
    SELECT fld_user_id, COUNT(*) As number_of_component
    FROM tbl_user_competens
    WHERE components IN($competens_in)
    GROUP BY fld_user_id   
) As uc
    ON u.fld_user_id = uc.fld_user_id
WHERE EXISTS
(
    SELECT 1
    FROM tbl_user_services As s
    WHERE s.fld_user_id = u.fld_user_id
    AND service IN($services_in)
)
ORDER BY number_of_component
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...