2012-12-03 15 views
1

你好,我试图成功地选择行作为mysql中的列。在mysql中通过php选择行作为列

也许有人可以帮助我。

这是我的表看起来像

+----------+----------------------------------------------------+----------+ 
| 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语句,但是我不知道如何去做。

如果是的话,出现这种情况,我会很感激

感谢您的宝贵时间任何人都可以更新我的查询。

+0

为什么不使用GROUP_CONCAT将所有代码作为一个数组存储在一个字段中? – didierc

回答

1

你在说的是部分转置,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']); 

注:我做了一些假设你基础表结构。相应地调整查询。

+0

这不起作用 – user1863457

+0

代码只是一个例子。你需要调整它。但是这种方法将起作用。 –

+0

我甚至不担心php只是要正确完成mysql语句。 – user1863457

0
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; 

试试这个。我认为你的品牌名称和品牌标识总是相同的。 如果他们会有所不同,他们将取消对品牌名称的检查。

这一个只是查询应该是什么的想法。你可以调整这个以获得更好的结果

0

编辑:如果你必须完全在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 

重复左连接,直到您有10个代码列。