[英]Conditional pivoting on MySQL table
我有一个表,其结构和数据如下所示。 基本上,一个对象可以具有多个纬度和经度值。 我想编写一个查询,以获取同一行中每个对象的经纬度对。
meta_id (PK) | object_id | key | value
1 | 1 | latitude_0 | 10
2 | 1 | longitude_0 | 100
3 | 1 | latitude_1 | 11
4 | 1 | longitude_1 | 111
5 | 1 | latitude_2 | 12
6 | 1 | longitude_2 | 122
查询结果是
object_id | latitude | longitude
1 | 10 | 100
1 | 11 | 111
1 | 12 | 122
棘手的部分是,可以有任意数量的经/纬对,因此我无法对查询进行硬编码。 一个对象可以有1对,也可以有40对。 通过对JOINs
进行硬编码,我可以很容易地得到结果,但这显然不是我想要的。 我在下面复制了当前查询,但是它无法配对适当的键索引,例如,它将latitude_0
与longitude_0
, longitude_1
和longitude_2
匹配。
SELECT p1.key, p1.value, p2.key, p2.value
FROM page_meta2 AS p1
INNER JOIN page_meta2 AS p2 ON
p1.object_id = p2.object_id AND
p1.meta_id != p2.meta_id
WHERE p1.object_id = 1 -- will be parameter in final query (e.g. ?)
AND p1.key LIKE 'latitude%'
AND p2.key LIKE 'longitude%'
复制我的环境的脚本是:
CREATE TABLE `page_meta` (
`meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`object_id` bigint(20) unsigned NOT NULL DEFAULT '0',
`key` varchar(255) DEFAULT NULL,
`value` longtext,
PRIMARY KEY (`meta_id`),
KEY `object_id` (`object_id`),
KEY `key` (`key`(191))
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `page_meta` ( `object_id`, `key`, `value`)
VALUES
(1,'latitude_0', '10'),
(1,'longitude_0','100'),
(1,'latitude_1', '11'),
(1,'longitude_1','111'),
(1,'latitude_2', '12'),
(1,'longitude_2','122'),
(2,'latitude_0', '20'),
(2,'longitude_0','200'),
(2,'latitude_1', '21'),
(2,'longitude_1','211'),
(2,'latitude_2', '22'),
(2,'longitude_2','222');
我会在连接条件中使用mysql的substring_index()函数来获取_
字符后的数字,因此匹配经/纬对:
SELECT p1.object_id, p1.value as lat, p2.value as long
FROM page_meta2 AS p1
INNER JOIN page_meta2 AS p2 ON
p1.object_id = p2.object_id AND
substring_index(p1.key, '_', -1) = substring_index(p2.key, '_', -1)
WHERE p1.object_id = 1 -- will be parameter in final query (e.g. ?)
AND p1.key LIKE 'latitude%'
AND p2.key LIKE 'longitude%'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.