列转行
在 mysql 查询时,往往需要对现成的数据列进行处理,得到所谓的行,这就是列转行。
下面举个栗子,有一个产品表,定义如下:
CREATE TABLE `products` ( `id` int(5) NOT NULL, `store1` int(5) DEFAULT NULL, `store2` int(5) DEFAULT NULL, `store3` int(5) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
以产品id 作主键,三个商户作列名,记录每一个产品在三家商户的售价,如果商户未售,该列记录为空

需要的结果是这样的:由 id,store,price 三列构成,即每一个产品对应每一个商户的售价自成一行,若商户未售,则不显示。
每个产品在单个商户下对应的售价很容易查询,我们要做的是把所有商户下的结果连接起来。所以
列转行的本质是
UNION
UNION
UNION
这里,union all 和 union 并没区别,只是效率高点而已
SELECT * FROM ( SELECT id , 'store1' as store, store1 as price FROM products UNION ALL SELECT id , 'store2' as store, store2 as price FROM products UNION ALL SELECT id , 'store3' as store, store3 as price FROM products )a WHERE !ISNULL(price)
得到的结果是这样的:

浙公网安备 33010602011771号