Выбрать из связанных таблиц - PullRequest
0 голосов
/ 04 апреля 2020

Так что в моей базе данных у меня есть 2 связанные таблицы: поля id, name, price и int, так что я знаю, все ли они проданы или нет

fruits

|IDfruit| name  | price  | sold  |
|  1    |orange | 5      | 0
|  2    |apple  | 10     | 0
|  3    |grape  | 15     | 1
|  4    |lemon  | 7      | 1

первичный ключ - IDfruit

images

|IDimage| url        | idfruit_image
| 1     | image1.png |     1      
| 2     | image2.png |     1
| 3     | image3.png |     2
| 4     | image4.png |     3    
| 5     | image5.png |     4
| 6     | image6.png |     4 
| 7     | image7.png |     4 

IDimage - первичный ключ, а idfruit_image - внешний ключ, который ссылается на IDfruit

Результат, который я хочу получить, - это все фрукты и ПЕРВЫЙ * Изображение каждого фрукта Могу ли я достичь этого?

А что, если я хочу все из всех проданных фруктов и только первое изображение каждого

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

Используйте GROUP BY, чтобы получить по одной строке на фрукт, и функцию агрегирования, чтобы выбрать одно из изображений.

SELECT f.*, MAX(url) AS url
FROM fruits AS f
LEFT JOIN images AS i ON f.idfruit = i.idfruit_image
GROUP BY f.idfruit
0 голосов
/ 04 апреля 2020

Я понимаю, что вы хотите, чтобы первое изображение на плод, первое было определено как: изображение с наименьшим idimage.

Если вы просто хотите, чтобы URL-адрес изображения, коррелированный подзапрос должен быть приемлемым решением:

select 
    f.*, 
    (
        select i.url 
        from images i 
        where i.idfruit_image = f.idfruit 
        order by i.idimage 
        limit 1
    ) url
from fruits f

Если вам нужна вся запись изображения, можно присоединиться к одному из вариантов, а затем выполнить фильтрацию с помощью подзапроса:

select f.*, i.*
from fruits f
inner join images i on i.idimage = (
    select min(i1.idimage) from images i1 where i1.idfruit_image = f.idfruit
)

Наконец: в MySQL 8.0, вы можете использовать row_number() для этого:

select *
from (
    select 
        f.*, 
        i.*, 
        row_number() over(partition by i.idfruit_image order by i.idimage) as rn
    from fruits f
    inner join images i on i.idfruit_image = f.idfruit
) t
where rn = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...