SQL: оператор для отображения 1 дочерней записи на одного родителя в отношении «один ко многим» - PullRequest
2 голосов
/ 22 мая 2009

У меня есть 2 таблицы, таблица продуктов и таблица изображений. Продукты могут иметь более 1 изображения на запись. Мне нужен оператор SQL, в котором будет отображаться 1 изображение для каждого продукта, а не все изображения для каждого продукта.

Сокращенный пример моих текущих усилий:

SELECT Product.RefCode, Img.ImgPath
FROM Product INNER JOIN (
    SELECT ProductImg.ImgPath, ProductImg.PrdFK
    FROM ProductImg 
    LIMIT 0,1) AS Img ON Product.PrdID = Img.PrdFK;

Приведенный выше пример возвращает 0 результатов, однако, если я удаляю LIMIT 0,1 из Sub SELECT, я получаю полный список всех продуктов и всех изображений.

Я просто хочу, чтобы была возвращена 1 запись изображения для каждой записи продукта.


Я изменил код "программиста" в MySQL, и он отлично работает.

SELECT Product.RefCode, 
        (Select ProductImg.ImgPath
         From ProductImg
         Where Product.PrdID = Img.PrdFK LIMIT 0,1) AS ImgPath
FROM Products

По какой-то причине при попытке решения "Билла Карвина" он долго отправлял загрузку сервера.

Ответы [ 4 ]

1 голос
/ 22 мая 2009

Это должно работать:

SELECT Product.RefCode,
       (Select Img.ImgPath
        From ProductImg
        Where Product.PrdID = Img.PrdFK LIMIT 0,1) As ImgPath
FROM Product

Если у вас есть способ определить, какое изображение должно возвращать выбранный объект, то вы можете добавить где и, возможно, Order By в подвыбор.

В следующем примере мы получим только самое последнее из активных изображений.

SELECT Product.RefCode,
       (Select Img.ImgPath
        From ProductImg
        Where Product.PrdID = Img.PrdFK
          And IsActive = 1
        Order By EntryDate Desc LIMIT 0,1) As ImgPath
FROM Product

Отредактировано и исправлено «Top 1» до «Limit 0,1».

0 голосов
/ 22 мая 2009

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

0 голосов
/ 22 мая 2009

Если у вас есть столбец ID в таблице изображений, это должно работать (независимо от того, какой продукт или версия SQL) -

   SELECT
            p.RefCode,
            i1.ImgPath
    FROM
            Product p
    INNER JOIN
            ProductImg i1 ON p.PrdId = i1.PrdFk
    LEFT JOIN
            ProductImg i2 ON i1.PrdId = i2.PrdId
            AND i1.ImgId < i2.ImgId
    WHERE
            i2.ImgId IS NULL
0 голосов
/ 22 мая 2009

MySQL имеет некоторую гибкость здесь. Вы можете использовать GROUP BY, чтобы ограничить результат одной строкой для каждого продукта, а затем MySQL будет произвольно выбирать, какое изображение. На практике это, как правило, изображение, которое сначала физически сохраняется в базе данных, но вы не можете это контролировать.

SELECT p.RefCode, i.ImgPath
FROM Product p INNER JOIN ProductImg i 
  ON (p.PrdID = i.PrdFK)
GROUP BY p.PrdID;

Если вам нужно 1 специфическое изображение для каждого продукта, есть способы сделать это тоже. Вы должны включить это в свои требования. : -)

...