题
我有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 SELECT我得到的所有产品和所有图像的完整列表。
我只想返回每个产品记录1个图像记录。
我已修改的“程序员”的代码到MySQL并能正常工作。
SELECT Product.RefCode,
(Select ProductImg.ImgPath
From ProductImg
Where Product.PrdID = Img.PrdFK LIMIT 0,1) AS ImgPath
FROM Products
有关试图“比尔Karwin的”解决方案时,由于某种原因,它发送的服务器负载很长一段时间。
解决方案
此应该工作:
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
和编辑校正 '顶1' 到 '限制0,1'。
其他提示
的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的具体的每个产品形象,有办法做到这一点。您需要包括在您的要求。 : - )
如果您对图像表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
您需要的是在图像表中的标志来指定,如果它是要显示的主图像。有拉动的任意图像的方式,但我认为这将是更好地确保你拉正确的图像。
不隶属于 StackOverflow