列转行

  在 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)

  得到的结果是这样的:

 

 

  

 

posted @ 2022-05-13 11:46  远走不高飞  阅读(23)  评论(0)    收藏  举报