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)cat = 1(items_id) ,

(items_name)dog = 2(items_id) ,

(items_name)cow = 3(items_id) 然后

(items_name)dog = 4(items_id) ,

(items_name)cow = 5(items_id) 还有

(items_name)cat = 6(items_id) 像这样

这里我点击cat 表示对应的cat id 存储在另一个表中。

4

1 回答 1

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

但这几乎不可读或高效。这也会很痛苦,因为当最大列数增加时您需要修改它。

于 2013-07-04T09:02:41.277 回答