Решение для заказа mysql: будет ли оно работать стабильно? - PullRequest
3 голосов
/ 21 апреля 2011

У меня был такой запрос:

SELECT `name`, floor(max(score)), skill
FROM
  (SELECT k.`name`, s.`name` as skill, *long complex formula* as score
  FROM `keywords_skills` ks
  JOIN keywords k        ON k.id = ks.keyword_id
  JOIN skills s          ON s.id = ks.skill_id
  JOIN jobs_keywords jk  ON jk.keyword_id = k.id
  WHERE job_id = 87293) t1
GROUP BY `name`
ORDER BY `name` asc

очевидно, я хочу, чтобы 'skill' ссылался на ту же строку, что и max (оценка), но я не знал, как это сделать.Тем не менее, когда я добавляю ORDER BY к подзапросу примерно так:

SELECT `name`, floor(max(score)), skill
FROM
  (SELECT k.`name`, s.`name` as skill, *long complex formula* as score
  FROM `keywords_skills` ks
  JOIN keywords k        ON k.id = ks.keyword_id
  JOIN skills s          ON s.id = ks.skill_id
  JOIN jobs_keywords jk  ON jk.keyword_id = k.id
  WHERE job_id = 87293
  ORDER BY score DESC) t1
GROUP BY `name`
ORDER BY `name` asc

кажется, что все работает отлично!Мой вопрос: я решил свою проблему или просто внедрил ненадежный хак, который будет преследовать меня позже?


РЕДАКТИРОВАТЬ: возможно, мне следовало бы объяснить больше, что я искал:

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

Я также подумал, что могу каким-то образом использовать LIMIT 1 (возможно, в подзапросе), но покане думал о том, как это осуществить.

1 Ответ

2 голосов
/ 21 апреля 2011

Я думаю, что вы близки к своему первому ... просто добавьте LIMIT 1 в дополнение к порядку, чтобы поставить наивысший навык первым (порядок по столбцу 3, который является вашей формулой оценки

- НА ПЕРЕСМОТРЕННУЮ УТОЧНЕНИЕ ... Я обмениваюсь запросом в иерархии рассматриваемого идентификатора JOB, а затем нахожу навыки ИТ и ключевые слова вместо обратного - опираясь на навыки ключевых слов. В случае, если вы хотите, вам понадобится вложенный запрос ... Пример:

Job A has Keywords
   Word A
       Skill A-1    Score:90  (you want this one)
       Skill A-2    Score:70
       Skill A-3    Score:60
   Word B 
       Skill B-1    Score:30
       Skill B-2    Score:20
       Skill B-3    Score:95  (you want this one)
       Skill B-4    Score:80
   Word C 
       Skill C-1    Score:10
       Skill C-2    Score:20
       Skill C-3    Score:30  (you want this one)

Внутренний запрос должен включать ТОЛЬКО идентификатор ключевого слова и максимальный балл для ключевого слова - все они связаны с одним идентификатором Job_ID в questino. ТО, снова присоединитесь, но на этот раз нам больше не нужны ключевые слова job_key, так как каждое описание K.ID и имени находится в предварительном запросе. Тогда просто нужно повторно присоединиться к навыкам, соответствующим квалификационному SCORE.

SELECT STRAIGHT_JOIN
      PreQuery.Keyword, 
      s.name as Skill, 
      PreQuery.Score
   from
      ( SELECT STRAIGHT_JOIN
              k.id,
              k.name Keyword, 
              max( s.Score ) maxScore
           from
              jobs_keywords jk
                 join keywords k 
                    on jk.keyword_id = k.id
                    join keyword_skills ks
                       on k.id = ks.keyword_id
                       join skills s
                          on ks.skill_id = s.id
           where 
              jk.job_id = 87293
           group by 
              k.id,
              k.name ) PreQuery
      join keyword_skills ks
         on PreQuery.id = ks.keyword_id
         join skills s
             on ks.skill_id = s.id
             AND PreQuery.maxScore = s.Score
   order by 
      PreQuery.Keyword
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...