2013-07-04 41 views
1

我的SQL表像下面如何讓行相同的值

表名package

pack_id   pack_name 
-------   --------- 
1    pack1 
2    pack2 
3    pack3 

表名items

items_id pack_id items_name  pack_name 
-------- ------- ----------  --------- 
1    1  cat    pack1  
2    1  dog    pack1 
3    1  cow    pack1 
4    2  dog    pack2 
5    2  cow    pack2 
6    3  cat    pack3 

在HTML中給予我想說明的包,比如

Pack1  cat   dog  cow 
pack2  dog   cow 
pack3  cat 

這裏第一

(items_name)貓= 1(items_id)

(items_name)狗= 2(items_id)

(items_name)牛= 3(items_id),然後

(items_name)狗= 4(items_id)

(items_name)牛= 5(items_id)也ANS

(items_name)貓= 6(items_id)這樣

這裏我點擊貓表示存儲在另一個表中的相應的貓ID。

+0

'items'表中的'pack_name'列是多餘的。已經有'pack_id','pack_name'駐留在'package'表 – Timmetje

+0

你想做什麼?你怎麼了?請說清楚一點。 – zari

回答

1

你似乎想要可變數量的列,這是不可能的。如果可能的列數量相當有限,也許可以這樣做。

爲了提高靈活性,所以最好把項目名稱在結果一列,用逗號分隔: -

SELECT a.pack_name, GROUP_CONCAT(b.items_name) 
FROM package a 
INNER JOIN items b 
ON a.pack_id = b.pack_id 
GROUP BY a.pack_id 

如果你真的在列想讓他們和只有列的數量有限,那麼你可以也許做這樣的事情: -

SELECT a.pack_name, MAX(Col0), MAX(Col1), MAX(Col2), MAX(Col3) 
FROM package a 
INNER JOIN 
(
    SELECT items_id, pack_id, IF(aSequence=0, items_name, NULL) AS Col0, IF(aSequence=1, items_name, NULL) AS Col1, IF(aSequence=2, items_name, NULL) AS Col2, IF(aSequence=3, items_name, NULL) AS Col3 
    FROM 
    (
     SELECT items_id, pack_id, items_name, @sequence := IF(@prevpack = pack_id, @sequence + 1, 0) AS aSequence, @prevpack := pack_id 
     FROM 
     (
      SELECT items_id, pack_id, items_name 
      FROM items 
      ORDER BY pack_id, items_id 
     ) Sub1 
     CROSS JOIN (SELECT @sequence:=0, @prevpack:=0) Sub2 
    ) Sub3 
) b 
ON a.pack_id = b.pack_id 
GROUP BY a.pack_id 

但這是難以閱讀或有效。這也將是一個痛苦,因爲當最大列數增加時,您需要修改它。

相關問題