SQL получает значение на основе соответствующего min / max (значения) из столбца в другой связанной таблице

#mysql #sql #join

#mysql #sql #Присоединиться

Вопрос:

У меня есть следующие две таблицы, связанные столбцом ID в качестве первичного ключа. Моя цель — запросить значения из столбца «Имя» в таблице 1, которые соответствуют идентификатору пользователя, с максимальными и минимальными значениями столбца «Оценка» из таблицы 2.

 Table 1:

| ID | Name |
|----|------|
| 1  | Foo  |
| 2  | Bar  |
| 3  | Zoo  |
| 4  | Bar  |
| 5  | Foo  |
| 6  | Zar  |

Table 2:

| ID | Score |
|----|-------|
| 1  | 98    |
| 2  | 67    |
| 3  | 86    |
| 4  | 59    |
| 5  | 75    |
| 6  | 73    |
  

Конечный результат должен дать мне что-то вроде этого:

 | Name | Score |
|------|-------|
| Foo  | 98    |
| Bar  | 59    |
  

Ответ №1:

Вы можете попробовать следующее —

     select name, score 
    from table1 t1 join table2 t2 on t1.id=t2.id
    where 
    score=(select max(score) from t2)
    or 
    score=(select min(score) from t2)
  

Ответ №2:

 (
SELECT name, score
FROM table1 NATURAL JOIN table2
ORDER BY 2 ASC LIMIT 1
)
UNION ALL
(
SELECT name, score
FROM table1 NATURAL JOIN table2
ORDER BY 2 DESC LIMIT 1
)
  

Комментарии:

1. Пожалуйста, не публикуйте только код в качестве ответа, но также предоставьте объяснение, что делает ваш код и как он решает проблему вопроса. Ответы с объяснением обычно более полезны и лучшего качества и с большей вероятностью привлекут голоса.

Ответ №3:

Если вы используете MySQL 8.0, вы можете использовать оконные функции:

 select t1.name, t2.score
from table1 t1
inner join (
    select t2.*, 
        rank() over(order by score) rn_asc, 
        rank() over(order by score desc) rn_desc
    from table2 t2
) t2 on t2.id = t1.id
where 1 in (rn_asc, rn_desc)
  

Идея состоит в том, чтобы ранжировать записи table2 по возрастанию и уменьшению score и использовать эту информацию для фильтрации. Обратите внимание, что это допускает верхние и нижние связи.