簡體   English   中英

MySQL-多行乘以1的ID並將多列數據轉換為逗號分隔的行

[英]MySQL - multi-row by 1 id & converting multi-column data into a comma delimited row

我有一個數據庫表:
分隔每個請求的請求者ID列(需要)
類別ID列,可將請求中的每個項目(類別)分為不同的類別
一個商品ID列,用於分隔類別(itemid)中的每個商品類型
列出項目名稱(項目)的項目名稱列
提供項目描述的項目描述符列(desc)
和金額列,給出該類別中每個項目的總費用(金額)

所以我的桌子看起來像這樣:

|---------|-------|----------|--------|-------|------------|
|  reqid  | catid | itemid   | item   | desc  | amount     | 
|---------|-------|----------|--------|-------|------------|
|  1      | 3     | 16       | food   | food  | 200        | 
|---------|-------|----------|--------|-------|------------|
|  1      | 3     | 17       | water  | wtr   | 50         | 
|---------|-------|----------|--------|-------|------------|
|  1      | 3     | 18       | film   | film  | 20         | 
|---------|-------|----------|--------|-------|------------|
|  1      | 5     | 30       | room   | room  | 500        | 
|---------|-------|----------|--------|-------|------------|
|  1      | 5     | 31       | chair  | chair | 150        | 
|---------|-------|----------|--------|-------|------------|
|  2      | 3     | 16       | food   | food  | 200        | 
|---------|-------|----------|--------|-------|------------|
|  2      | 3     | 17       | water  | wtr   | 50         | 
|---------|-------|----------|--------|-------|------------|
|  3      | 3     | 18       | film   | film  | 20         | 
|---------|-------|----------|--------|-------|------------|
|  3      | 5     | 30       | room   | room  | 500        | 
|---------|-------|----------|--------|-------|------------|
|  3      | 5     | 31       | chair  | chair | 150        | 
|---------|-------|----------|--------|-------|------------|

我希望我的查詢結果看起來像

|--------|------------------|----------------------|--------------------|--------------------|
| reqid  | catid3itemid     | catid3item           | catid3desc         | catid3amount       | 
|--------|------------------|----------------------|--------------------|--------------------|
|  1     |16, 17, 18        | food, water, film    | food, wtr, film    | 200, 50, 20        | 
|--------|------------------|----------------------|--------------------|--------------------|
|  2     |16, 17            | food, water          |food, wtr           | 200, 50,           | 
|--------|------------------|----------------------|--------------------|--------------------|
|  3     |18                | film                 | film               | 20                 | 
|--------|------------------|----------------------|--------------------|--------------------|

繼續:

|------------------|----------------------|--------------------|--------------------|
| catid4itemid     | catid4item           | catid4desc         | catid4amount       | 
|------------------|----------------------|--------------------|--------------------|
|                  |                      |                    |                    | 
|------------------|----------------------|--------------------|--------------------|
|                  |                      |                    |                    | 
|------------------|----------------------|--------------------|--------------------|
|                  |                      |                    |                    | 
|------------------|----------------------|--------------------|--------------------|

繼續決賽:

|------------------|----------------------|--------------------|--------------------|
| catid5itemid     | catid5item           | catid5desc         | catid5amount       | 
|------------------|----------------------|--------------------|--------------------|
|30,31             |room, chair           |room, chair         | 500, 150           | 
|------------------|----------------------|--------------------|--------------------|
|                  |                      |                    |                    | 
|------------------|----------------------|--------------------|--------------------|
|30,31             |room, chair           |room, chair         | 500, 150           | 
|------------------|----------------------|--------------------|--------------------|

我一直在看有關使用GROUP_CONCAT或CROSS APPLY或SWITCH STATEMENT的帖子

例如GROUP_CONCAT:

select *, GROUP_CONCAT(`table`.`categoryid` ORDER BY `table`.`categoryid` ASC SEPARATOR ', ') AS `categoryid`
from `table` 
GROUP BY `table`.`requestid`

但這會將所有內容集中到一列,而不是由類別ID分隔,而是將所有類別ID合並到一列中。

任何建議或幫助將不勝感激。

謝謝大家的幫助! 我沒有使用數據透視表就知道了

選擇table requestid AS request_id ,GROUP_CONCAT((情況下( tablecategoryid = 2),那么tableitem端)分離器”, ')AS item2 ,GROUP_CONCAT((情況下( tablecategoryid = 2),那么tabledescriptor端)分隔符' , ')AS descriptor2 ,GROUP_CONCAT((情況下( tablecategoryid = 2),那么tableamount端)分離器',“)AS amount2 ,GROUP_CONCAT((情況下( tablecategoryid = 3),那么tableitem端)分離器' ')AS item3 ,GROUP_CONCAT((情況下( tablecategoryid = 3),那么tabledescriptor端)分離器',')AS descriptor3 ,GROUP_CONCAT((情況下( tablecategoryid = 3),那么tableamount端)分離器' ')AS amount3 GROUP_CONCAT((情況下( tablecategoryid = 4),那么tableitem端)分離器',')AS item4 ,GROUP_CONCAT((情況下( tablecategoryid = 4),那么tabledescriptor端)分離器' ')AS descriptor4 ,GROUP_CONCAT((情況下( tablecategoryid = 4),那么tableamount端)分離器',')AS amount4 GROUP_CONCAT((情況下( tablecategoryid categoryid = 5)然后是table item端)分離器' ')AS item5 ,GROUP_CONCAT((情況下( tablecategoryid = 5),則tabledescriptor端)分離器',')AS descriptor5 ,GROUP_CONCAT((情況下( tablecategoryid = 5),然后tableamount端)分離器'')AS amount5

table

其中(( tablecategoryid = 2)或( tablecategoryid = 3)或( tablecategoryid = 4)或( tablecategoryid = 5))

table分組。 requestid

如果類別是固定的(3、4和5),則可以使用以下查詢:

select 
reqid,
group_concat(distinct if(catid = 3, itemid, null)) as catid3itemid, 
group_concat(distinct if(catid = 3, item, null)) as catid3item, 
group_concat(distinct if(catid = 3, `desc`, null)) as catid3desc, 
group_concat(distinct if(catid = 3, amount, null)) as catid3amount , 
group_concat(distinct if(catid = 4, itemid, null)) as catid4itemid, 
group_concat(distinct if(catid = 4, item, null)) as catid4item, 
group_concat(distinct if(catid = 4, `desc`, null)) as catid4desc, 
group_concat(distinct if(catid = 4, amount, null)) as catid4amount , 
group_concat(distinct if(catid = 5, itemid, null)) as catid5itemid, 
group_concat(distinct if(catid = 5, item, null)) as catid5item, 
group_concat(distinct if(catid = 5, `desc`, null)) as catid5desc, 
group_concat(distinct if(catid = 5, amount, null)) as catid5amount 
from tab 
group by reqid;


如果必須是動態的,則可以使用過程。 下面,我使用了重復結構來生成查詢,該查詢返回每個catid所需的結構(最小到最大)並使用准備好的語句執行它:

-- only to avoid problem with only_full_group_by
set global sql_mode = "";

create table tab (reqid int, catid int, itemid int, item varchar(10), `desc` varchar(20), amount int);
insert into tab values
(1, 3, 16, 'food', 'food', 200),
(1, 3, 17, 'water', 'wtr', 50),
(1, 3, 18, 'film', 'film', 20),
(1, 5, 30, 'room', 'room', 500),
(1, 5, 31, 'chair', 'chair', 150),
(2, 3, 16, 'food', 'food', 200),
(2, 3, 17, 'water', 'wtr', 50),
(3, 3, 18, 'film', 'film', 20),
(3, 5, 30, 'room', 'room', 500),
(3, 5, 31, 'chair', 'chair', 150);

delimiter $$
CREATE PROCEDURE result()
BEGIN

    DECLARE i INT DEFAULT (select min(catid) from tab);
    DECLARE iEnd INT DEFAULT (select max(catid) from tab);

    SET @sQuery = 'select reqid';

    WHILE i <= iEnd DO

        set @sQuery = CONCAT(@sQuery, 
            ', group_concat(distinct if(catid = ',i,', itemid, null)) as catid',i,'itemid,
            group_concat(distinct if(catid = ',i,', item, null)) as catid',i,'item, 
            group_concat(distinct if(catid = ',i,', `desc`, null)) as catid',i,'desc, 
            group_concat(distinct if(catid = ',i,', amount, null)) as catid',i,'amount'
        );

        SET i = i + 1;
    END WHILE; 

    SET @sQuery = CONCAT(@sQuery, ' from tab group by reqid');

    PREPARE stmt FROM @sQuery;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

END $$


call result();


注意:因為您沒有提供太多詳細信息,而且正如注釋中所述,所以最好在應用程序中執行顯示邏輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM