2011-10-17 56 views
3

我希望能夠使用我的產品數據返回縮略圖(一組的第一張圖像) - 完成此操作的最佳方式(性能) ?MySQL加入或子查詢 - 獲取產品數據以及第一個產品圖像

我有以下表格:

產品(產品數據)
products_images
圖片(產品和形象之間的關係)(圖像數據)

因此,對於每一個產品,它會返回與該產品相關聯的集合的第一個圖像。

兩件事情:

  • 我試圖讓第一圖像,但順序取決於一個「秩序」 場。
  • 如果找不到圖像只是圖像數據返回null,但仍然 獲得產品。

我想做一個子查詢,因爲我不知道如何對圖像結果進行排序和限制連接。

你有什麼建議?

編輯:

圖像順序字段存在於products_images表。該表具有以下字段(產品,image_id,順序)

+0

在該表是'order'場? 'products_images'或'images'?事實上,你可以只發布完整的創建表定義('SHOW CREATE TABLE ....')嗎? –

+0

@Mark - 我目前無權訪問模式,但我知道prodcuts_images表中存在訂單字段。讓我知道你是否需要更多信息。乾杯 – RS7

回答

2
SELECT 
    p.* 
    , i.thumbnail 
FROM 
    products AS p 
    LEFT JOIN 
    images AS i 
     ON i.image_id = 
     (SELECT image_id 
      FROM products_images AS pi 
      WHERE pi.product_id = p.product_id 
      ORDER BY `order` ASC      --- or DESC 
      LIMIT 1 
     ) 

products_images(product_id, order, image_id)的指數將是有益的子查詢的運行速度。

+0

我正在使用的框架(CodeIgniter)一直試圖在JOIN中轉義SELECT並打破查詢 - 在繼續並將我的查詢切換到純SQL之前,還有另一種方法可以在不丟失性能的情況下執行此操作嗎? (放入SELECT或類似的東西?)乾杯 – RS7

+0

@ RS7:你是否刪除了「---或DESC」部分?這只是一個評論(也許它混淆CodeIgniter?) –

+0

如果你的意思是如何翻譯CodeIgniter這個查詢,我不知道這是可能的(與不尋常的'ON table.field =(SELECT ... )'條件)。也許你可以問另一個問題。 –

0

這應該由product_images表中的列order給你的第一個形象:

SELECT * 
FROM products p 
LEFT JOIN (
    SELECT pi.product_id, i.* 
    FROM images i 
    INNER JOIN (
     SELECT product_id, image_id 
     FROM products_images pi 
     ORDER BY `order`   
    ) pi ON i.image_id = i.id 
    GROUP BY product_id 
) i ON i.product_id = p.id 
+0

請參閱Quassnoi在這個問題上的回答:http://stackoverflow.com/questions/1201296/how-to-optimize-mysql-query-group-and-order/1201365# 1201365爲什麼你不應該這樣做(通過在子查詢中排序 - 然後在查詢中分組)。 –