Наиболее эффективный запрос для получения минимального значения столбца в зависимости от значения его сопоставления из другой таблицы - PullRequest
0 голосов
/ 26 сентября 2019

Вот пример

carsOwned
name|car
1   |acura
1   |honda
1   |mercedes
2   |honda
2   |mercedes
3   |acura
4   |mercedes
carValue
car     | value
honda   | 1
acura   | 2
mercedes| 3
Output
name | min
1    |honda
2    |honda
3    |acura
4    |mercedes

В выходных данных каждое имя отображает самый дешевый автомобиль (значения показаны в таблице carValue), которым он владеет.Не уверен, как сделать эту операцию наиболее эффективным способом.

1 Ответ

0 голосов
/ 26 сентября 2019

Я понимаю, что для каждого name в carOwned вы хотите выбрать автомобиль с наименьшим значением в carValue.

Это можно устранить, присоединив обе таблицы и добавив условие NOT EXISTS, обеспечивающее сохранение только записи с наименьшим возможным значением:

SELECT o.*
FROM carsOwned o
INNER JOIN carValue v ON v.car = o.car
WHERE NOT EXISTS (
    SELECT 1
    FROM carsOwned o1
    INNER JOIN carValue v1 ON v1.car = o1.car
    WHERE o1.name = o.name AND v1.value < v.value
);

Или в MySQL 8.0 выможно использовать ROW_NUMBER():

SELECT name, car
FROM (
    SELECT o.*, ROW_NUMBER() OVER(PARTITION BY o.name ORDER BY v.value) rn
    FROM carsOwned o
    INNER JOIN carValue v ON v.car = o.car
) x
WHERE rn = 1

Демонстрация на DB Fiddle :

| name | car      |
| ---- | -------- |
| 1    | honda    |
| 2    | honda    |
| 3    | acura    |
| 4    | mercedes |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...