2010-07-24 89 views
1

請有人可以幫我解決這個問題。我似乎無法繞過我需要的SQL語句來獲得我想要的東西。下面是我的桌子。MySQL select從列中取2個值並返回一行

| product_id | product_name | product_thumb_image | 
------------------------------------------------------ 
|  1  | ProductA | images/img_A.jpg | 
|  2  | ProductB | images/img_B.jpg | 
|  3  | ProductB | images/img_B2.jpg | 
|  4  | ProductC | images/img_C.jpg | 
|  5  | ProductD | images/img_D.jpg | 

注意這裏有2個產品。

我想要一個SQL語句來選擇「product_thumb_image」,以便它爲每個產品名稱返回一行,但產品具有第二個圖像時則返回第二個列。

例如

| mages/img_A.jpg | NULL/0/''   | 
| mages/img_B.jpg | images/img_B2.jpg | 
| mages/img_C.jpg | NULL/0/''   | 
| mages/img_D.jpg | NULL/0/''   | 

任何幫助將不勝感激,謝謝。

+0

產品是否可以有兩個以上的圖像? – Mike 2010-07-24 14:54:07

+0

是的,雖然它通常不會超過5 – Martin 2010-07-24 15:10:22

回答

1

這是顯著更容易解決與排名功能,但MySQL不支持他們呢。相反,你可以模擬一個排名:

Select P.product_name 
    , Min(Case When P.ProductRank = 0 Then product_thumb_image End) As Image0 
    , Min(Case When P.ProductRank = 1 Then product_thumb_image End) As Image1 
From (
     Select product_id, product_name, product_thumb_image 
      , (Select Count(*) 
       From Products As P2 
       Where P2.product_name = P1.product_name 
        And P2.product_id < P1.product_Id) As ProductRank 
     From Products As P1 
     ) As P 
Group By P.product_name 

這裏的另一種方式來寫這可能有更好的表現相同的查詢:

Select P.product_name 
    , Min(Case When P.ProductRank = 0 Then product_thumb_image End) As Image0 
    , Min(Case When P.ProductRank = 1 Then product_thumb_image End) As Image1 
From (
     Select P1.product_id, P1.product_name, P1.product_thumb_image 
      , Count(P2.product_id) As ProductRank 
     From Products As P1 
      Left Join Products As P2 
       On P2.product_name = P1.product_name 
        And P2.product_id < P1.product_Id 
     Group By P1.product_id, P1.product_name, P1.product_thumb_image 
     ) As P 
Group By P.product_name 
+0

謝謝托馬斯,但是當我在phpMyAdmin中運行SQL語句時,沒有任何反應,我甚至沒有收到錯誤或被告知返回0行。 – Martin 2010-07-25 09:25:52

+0

@馬丁 - 奇。使用你的測試數據,我確實得到了你想要的結果。當只運行內部查詢時,你會得到結果嗎?在第一個查詢中,您只需直接從產品表中進行選擇,因此不應有任何原因導致您無法獲得結果。在第二種解決方案中,它再次與自身相連,你應該得到一些東西。 – Thomas 2010-07-25 15:51:52

+0

謝謝托馬斯,你的SQL語句工作得很好,儘管它有點長。他們確實回答了我問的問題,爲你+1。謝謝! – Martin 2010-07-26 08:33:48

1

你將需要兩個子查詢。一拿到第一的形象,一個第二:

SELECT t1.product_name, t2.product_thumb_image, t3.product_thumb_image 
FROM mytable t1 
LEFT OUTER JOIN (SELECT x.product_thumb_image 
       FROM mytable x 
       WHERE x.product_name = t1.product_name 
       LIMIT 0,1) t2 
LEFT OUTER JOIN (SELECT x.product_thumb_image 
       FROM mytable x 
       WHERE x.product_name = t1.product_name 
       LIMIT 1,1) t3 
GROUP BY t1.product_name 
1

由於每個產品的圖像數量可變的,寫的MySQL返回列你想要變得困難而相當笨拙。相反,爲什麼不運行一個簡單的GROUP_CONCAT來返回一個以逗號分隔的列表,然後在應用程序中分割結果。在返回文件名列表時,逗號分隔符不太可能出現在文件名中:

SELECT 
    `product_name`, 
    GROUP_CONCAT(`product_thumb_image`) AS product_thumb_images 
FROM `product` 
GROUP BY `product_name`; 

+--------------+------------------------------------+ 
| product_name | product_thumb_images    | 
+--------------+------------------------------------+ 
| ProductA  | images/img_A.jpg     | 
| ProductB  | images/img_B.jpg,images/img_B2.jpg | 
| ProductC  | images/img_C.jpg     | 
| ProductD  | images/img_C.jpg     | 
+--------------+------------------------------------+ 
+0

邁克夢幻般的解決方案!謝謝!簡單的SQL語句以另一種方式滿足我的需求。 – Martin 2010-07-25 09:28:15