[英]Selecting rows as columns in mysql through php
您好,我正在嘗試成功選擇行作為mysql中的列。
也許有人可以幫助我。
這是我的桌子的樣子
+----------+----------------------------------------------------+----------+
| brand_id | brand_name | linecode |
+----------+----------------------------------------------------+----------+
| DPQT | 1-800 Tow Truck | DER |
| DPQT | 1-800 Tow Truck | DCF |
| DPQT | 1-800 Tow Truck | DCA |
| DPQT | 1-800 Tow Truck | AAA |
| DPQT | 1-800 Tow Truck | DDD |
| BLGR | 1-800-Radiator | Curt |
| BGVM | 100+ Manufacturing/Coyote | ASC |
| DPQS | 10C Technologies Inc | AQW |
| DPQS | 10C Technologies Inc | ASQ |
| FDJG | 2 Cool AirVents | CAS |
我正在嘗試使結果看起來像:
+----------+----------------------------------------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+--------+
| brand_id | brand_name | Code1 | Code2 | Code3 | Code4 | Code5 | Code6 | Code7 | Code8 | Code9 | Code10 |
+----------+----------------------------------------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+--------+
| DPQT | 1-800 Tow Truck | DCF | DCA | AAA | DDD | DER | NULL | NULL | NULL | NULL | NULL |
| BLGR | 1-800-Radiator | Curt | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| BGVM | 100+ Manufacturing/Coyote | ASC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| DPQS | 10C Technologies Inc | ASQ | AQW | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| FDJG | 2 Cool AirVents | CAS | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
如您所見,當brand_id和brand_name相同時,我想將行代碼分組到單獨的列中
最大行代碼將永遠是10。這就是為什么我有Code1-Code10
這是我現在正在做的,並且沒有用。
$sql0 = 'set @num := 0';
$result = mysqli_query($dbh,"select brand_id, brand_name,
max(case when group_row_number = 1 then linecode end) Code1,
max(case when group_row_number = 2 then linecode end) Code2,
max(case when group_row_number = 3 then linecode end) Code3,
max(case when group_row_number = 4 then linecode end) Code4,
max(case when group_row_number = 5 then linecode end) Code5,
max(case when group_row_number = 6 then linecode end) Code6,
max(case when group_row_number = 7 then linecode end) Code7,
max(case when group_row_number = 8 then linecode end) Code8,
max(case when group_row_number = 9 then linecode end) Code9,
max(case when group_row_number = 10 then linecode end) Code10
from ( select brand_id, brand_name, linecode, @num := @num + 1 as group_row_number from linecodes_temp ) src
group by brand_id, brand_name
order by if(linecode = '' or linecode is null,1,0), brand_name ASC");
我得到的結果是
+----------+----------------------------------------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+--------+
| brand_id | brand_name | Code1 | Code2 | Code3 | Code4 | Code5 | Code6 | Code7 | Code8 | Code9 | Code10 |
+----------+----------------------------------------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+--------+
| DPQT | 1-800 Tow Truck | DER | DCF | DCA | AAA | DDD | NULL | NULL | NULL | NULL | NULL |
| BLGR | 1-800-Radiator | NULL | NULL | NULL | NULL | NULL | Curt | NULL | NULL | NULL | NULL |
| BGVM | 100+ Manufacturing/Coyote | NULL | NULL | NULL | NULL | NULL | NULL | ASC | NULL | NULL | NULL |
| DPQS | 10C Technologies Inc | NULL | NULL | NULL | NULL | NULL | NULL | NULL | AQW | ASQ | NULL |
| FDJG | 2 Cool AirVents | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | CAS |
我需要一種方法,使brand_id和brand_name更改后,num變量將恢復為0。
如您所見,它正在執行我想要的操作,但是一旦轉到下一行,num變量將繼續向上移動到下一列。 這樣便可以添加下一行代碼。 我假設我在某些地方需要if語句,但是我不知道該怎么做。
如果有人可以更新我的查詢,以便這種情況發生,我將非常感激
感謝您的時間。
您正在談論的是部分轉置 ,PHP不會自動完成。 但是,您可以自己進行一些小的修改。
在查詢中,使用GROUP_CONCAT()
:
SELECT brand_id, brand_name, GROUP_CONCAT(linecode) AS codes brands GROUP BY brand_id, brand_name
在PHP中,使用explode()
獲得不同的代碼 :
$codes = explode(',', $row['codes']);
注意:我對您的基礎表結構做了一些假設。 相應地調整查詢。
select a.name,a.value,a.code,T.code from test1 as a INNER JOIN test1 as T on
a.name=T.name and a.value = T.value and a.code != T.code group by a.name;
嘗試這個。 我假設您的品牌名稱和品牌ID總是一樣。 如果它們會有所不同,則會刪除對品牌名稱的檢查。
這只是查詢的概念。 你可以調整以獲得更好的結果
編輯:如果您必須完全在MySQL中執行此操作,這不是很漂亮,但是...
SELECT
a.brand_id, a.brand_name, b.linecode AS code1, c.linecode AS code2, d.linecode AS code3, e.linecode AS code4, f.linecode AS code4 FROM test a
LEFT JOIN
test b ON b.brand_id = a.brand_id
LEFT JOIN
test c ON c.brand_id = b.brand_id AND b.linecode != c.linecode
LEFT JOIN
test d ON d.brand_id = c.brand_id AND d.linecode != c.linecode AND d.linecode != b.linecode
LEFT JOIN
test e ON e.brand_id = d.brand_id AND e.linecode != d.linecode AND e.linecode != c.linecode AND e.linecode != b.linecode
LEFT JOIN
test f ON f.brand_id = e.brand_id AND f.linecode != e.linecode AND f.linecode != d.linecode AND f.linecode != c.linecode AND f.linecode != b.linecode
GROUP BY
a.brand_id
ORDER BY
a.brand_id
重復LEFT JOIN,直到您有10個代碼列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.