2016-02-01 77 views
1

我想獲得一個查詢,以返回我的精選項目表中的產品的所有相關記錄。所有正在爲簡單的MYSQL查詢工作,但我想獲得每個產品兩個拇指圖像存儲在另一個表(product_image),但有一個捕獲。在此「product_image」表中,不是每個產品(product_id)都會有一條記錄,因爲它僅在上傳圖像時填充,而某些產品可能有多個記錄(存儲圖像),我只希望爲每個產品ID返回一條記錄。因此,產品表中的產品記錄與product_image表有0到很多的關係。MYSQL - 加入或子查詢問題

我有一個工作的基本SQL語句的基本沒有返回的圖像,我可以編碼一個查詢,只返回在產品圖像表中有記錄的產品,但我需要查詢返回外部的所有行查詢,然後1個thumb_img匹配來自圖像表的產品ID,如果沒有圖像,它可以返回一個Null值。

這可能嗎?以下是我的最新嘗試,但這只是返回第一個product_ID的匹配縮略圖,併爲其他3個(在此情況下由於限制在最後)記錄重複此操作。我需要匹配的每個記錄的拇指,而不是匹配的記錄在其餘的記錄之間重複的第一條記錄。如果沒有該產品ID的記錄,則返回null。

SELECT * FROM `products`, `featured_products`, `shop`, (SELECT thumbSrc 
      FROM product_image 
     WHERE products.productId = product_image.productID 
     ORDER BY product_image.position ASC 
     LIMIT 1) image 
where shop.shopId = products.shopId AND featured_products.productId = products.productId AND visible = '1' LIMIT 4 

在此先感謝您的任何幫助/反饋。是否有可能這樣做,因爲我想保持我的數據庫儘可能標準化,而不是導致在產品表中存儲拇指字段。

+0

瞭解外部連接。並將product_Image加入產品表,而不是您的方法。我最喜歡的解釋這些連接如何工作的網站之一是http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/。 – xQbert

+0

謝謝,我會讀入外部連接,非常感謝 – Chicker

回答

0

未經測試,並且可能會有更好的(性能)方法來進行子選擇......我正在做PI。

實際上,要搭建的是返回所有產品,相關特徵產品和商店。然後只返回那些有匹配產品的圖像;但只有在圖像是位置最低的產品圖像時才適用。這樣的產品,feature_product和商店沒有得到排除如果圖像丟失(因此的左[外]性質加入)

SELECT * 
FROM PRODUCTS P 
INNER JOIN Featured_Products FP 
on P.ProductID = FP.ProductID 
INNER JOIN SHOP S 
P.ShoPID = S.ShopID 
LEFT JOIN (Select thmbsrc, productID, position, min(Position) as MinPosition 
      FROM Product_Image PI 
      group by thmbsrc, productID, Position 
      having MinPosition = position) PI 
on PI.ProductID = P.ProductID 

如果我們首先得到的所有列表,性能可能會提高具有最低位置的productID,然後將其加回到product_image以獲取imgsrc。類似於(Select min(position) minPos, productID from product_Image)可能允許SQL引擎查看每條記錄一次,而不是針對having子句中的每個值(如果位置被索引,則這甚至會更快)。

所以......

SELECT * 
FROM PRODUCTS P 
INNER JOIN Featured_Products FP 
on P.ProductID = FP.ProductID 
INNER JOIN SHOP S 
P.ShoPID = S.ShopID 
LEFT JOIN (Select imgsrc FROM Product_Image PI 
      INNER JOIN (Select min(position) minPos, productID 
         from product_Image 
         GROUP BY ProductID) PI2 
      on PI.ProductID = PI2.ProductID 
      and PI.position = PI2.PminPos) 
on PI.ProductID = P.ProductID 

可能因表的統計信息和可用指標有更好的表現。