2011-10-06 43 views
0

我有以下SQL查詢:訂購超過1場INNER JOIN查詢

SELECT products.id, 
     products.title, 
     products.size, 
     products.price, 
     products.text_description, 
     products.main_description, 
     products.priority, 
     gallery.id, 
     gallery.main 
     FROM gallery INNER JOIN products ON gallery.id=products.id 
     GROUP BY products.priority ASC 

數據庫中的每個產品都有與之相關的多個圖像。上面的查詢列出了該產品的1張圖片。每張圖片都有一個帶有時間戳的字段,該條目在上傳圖像時獲得。我需要修改上面的SQL查詢來獲取爲某個產品上傳的第一個圖像,例如ORDER BY UPLOAD_TIME ASC。有人能幫助我嗎?

謝謝。

+1

有幾種可能的方法。但出於性能方面的原因,向觀衆介紹所使用的數據庫產品和版本將是一個非常好的主意。 –

+2

考慮到「GROUP BY」子句,我在猜測MySQL –

+0

這就是MySQL 5.1.4 – cycero

回答

1

這裏有兩種方法可以實際控制你的MySQL中獲取哪一行,當你想在第一行的一組

使用限制1

SELECT products.id, 
     products.title, 
     products.size, 
     products.price, 
     products.text_description, 
     products.main_description, 
     products.priority, 
     gallery.id, 
     gallery.main 
FROM products 
CROSS JOIN 
(SELECT 
     gallery.id, 
     gallery.main 
    FROM 
     gallery 
    WHERE 
     products.[id] = gallery.[id] 
    ORDER BY 
     gallery.[timestamp] DESC 
    LIMIT 1) gallery 
GROUP BY 
    products.priority ASC 

現在,這個工作也是如此。 使用MAX()

SELECT products.id, 
     products.title, 
     products.size, 
     products.price, 
     products.text_description, 
     products.main_description, 
     products.priority, 
     gallery.id, 
     gallery.main 
FROM products 
INNER JOIN gallery 
ON products.id = gallery.id 
INNER JOIN 
    (SELECT 
     max(gallery.timestamp) timestamp, 
     gallery.[id] 
    FROM 
     gallery 
    GROUP BY 
     gallery.[id] 
    ) maxgallery 
ON gallery.id = maxgallery.id and gallery.timestamp = maxgallery.timestamp 
GROUP BY 
    products.priority ASC 
從性能,您必須特別注意這兩個查詢是如何處理關係

如果有兩個記錄共享使用LIMIT 1只會返回ID和時間戳電位差

除了一個記錄。當使用MAX()時,可以返回多個記錄。

我會留給你,哪一個更好,或者如果它有所作爲。

0
INNER JOIN 
    (SELECT TOP 1 
     col1, 
     col2,..., 
     coln 
    FROM 
     products 
    WHERE 
     products.[id] = gallery.[id] 
    ORDER BY 
     products.[timestamp] DESC) 
ON... 

這將是一個較慢的查詢,因爲它需要做的嵌套子查詢在主查詢的每個行......或許相關表中的數據加載到內存中的表將加速這一過程。