#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
и использовать эту информацию для фильтрации. Обратите внимание, что это допускает верхние и нижние связи.