2009-05-22 4 views
2

У меня есть 2 таблицы, таблица продуктов и таблица изображений. Продукты могут иметь более 1 изображения на запись. Мне нужен оператор SQL, который будет отображать 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 ВЫБРАТЬ я получить полный список всех продуктов и все изображения.

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


Я переработал код «программист» для MySQL, и он отлично работает.

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

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

ответ

1

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

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

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

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

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» to «Limit 0,1».

+0

Ключевое слово TOP принадлежит Microsoft SQL Server (и Sybase). –

+0

Извините, я этого не знал. Большое спасибо. –

+0

Я сделал небольшую ревизию (см. Выше), но заявление отлично работало, спасибо. – ticallian

0

У 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 конкретных изображений для каждого продукта, есть способы, чтобы сделать это. Вы должны включить это в свои требования. :-)

0

Если у вас есть столбец 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

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

 Смежные вопросы

  • Нет связанных вопросов^_^