我需要為每個產品創建一個帶有預覽影像的產品串列。
我有一個非常簡單的產品資料結構。一張表用于產品,一張表用于產品的影像。一個產品可以有任意數量的影像。結構如下所示:
PRODUCT
id | name
1 Test Product A
2 Test Product B
3 Test Product C
PRODUCTIMAGE
id | productId | file | priority
1 1 foo.jpg 0
2 1 bar.jpg 1
3 2 something.png 1
4 2 yada.png 0
5 1 yougettheidea.gif 2
很直接。唯一值得一提的是,productimages 有一個“優先級”,它TINYINT決定了給定產品的影像顯示順序。這個想法是:優先級越高,影像應該越早顯示在詳細資訊頁面的產品影像串列中。但是對于我們即將創建的這個產品串列,每個產品我只需要一張預覽影像。
因此,正如最初所述,我的目標是獲得所有產品的串列。所以讓我們從非常簡單的開始:
SELECT *
FROM product
現在我還想在產品頁面中顯示一個預覽影像,所以我需要一點點加入:
SELECT `p`.*,
`pi`.`file` `previewImage`
FROM `product` `p`
LEFT JOIN `productImage` `pi` ON (`pi`.`productId` = `p`.`id`)
GROUP BY `p`.`id`
到目前為止一切順利,這為每個產品提供了一張預覽影像以顯示在產品串列中。再多走一步:我想要每個產品的具有最高優先級的預覽影像作為預覽影像。所以我嘗試使用子查詢以所需的優先級順序獲取產品影像:
SELECT `p`.*,
`pi`.`file` `previewImage`
FROM `product` `p`
LEFT JOIN (
SELECT *
FROM `productImage`
ORDER BY `priority` DESC
) `pi` ON (`pi`.`productId` = `p`.`id`)
GROUP BY `p`.`id`
但出于某種原因,這并沒有(可靠地)讓我獲得每個產品具有最高優先級的產品影像。這是為什么?我認為這GROUP BY是選擇了錯誤的 productImage 條目來保留,但為什么呢?它不應該選擇第一個,由于子查詢應該是具有最高優先級的那個嗎?
uj5u.com熱心網友回復:
您的 group by 是部分group by。您正在分組,product.id因此 MySQL 將對每個產品的結果進行分組,但在每個組內,它可以自由地從productimage表中回傳任何行。要獲得確定性結果,該表中的每一列都需要包含在聚合函式(MIN、MAX 等)中,但這不會為您提供具有最高優先級的影像。
話雖如此,如果您只想要productimage表中的一列,您可以在 select 中使用子查詢:
select product.*, (
select file
from productimage
where productimage.productid = product.id
order by priority desc
limit 1 -- this is the important bit
) as productimage_file
from product
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/366227.html
