我有以下mysql db表结构:
Table_1

我需要将这些值(post_id及其相应的geo_lat和geo_lon插入到另一个表中,如下所示)
Table_2

到目前为止,这就是我所拥有的:
$query = "INSERT INTO table_2(post_id,geo_lat,geo_lon)
SELECT post_id,meta_key IN(geo_lat),meta_key IN(geo_lon) //????
FROM table_1";
$wpdb->query($query);当然,这是错误的,我有点被困在如何做它(相当新的php)。
有人能帮我吗?
谢谢。
发布于 2016-10-06 23:42:32
您可以同时使用GROUP BY和MAX来“旋转”这些值:
INSERT INTO table_2 (Post_id, Geo_lat, Geo_lon)
SELECT post_id,
MAX(IF(meta_key='geo_lat',meta_value,NULL)),
MAX(IF(meta_key='geo_lon',meta_value,NULL))
FROM table_1
GROUP BY post_id这有点不言自明,但是如果您想更好地理解这个查询,可以尝试使用一个更简单的SELECT语句:
SELECT post_id,
IF(meta_key='geo_lat',meta_value,NULL) lat,
IF(meta_key='geo_lon',meta_value,NULL) lon
FROM table_1这样做是返回一个三列集,第一列是ID,第二列(在这里命名为lat )只有在行中的meta_key是geo_lat时才会带来meta_value,否则是NULL。第三列相同,但适用于geo_lon。它将生成如下所示的集合:
+---------+---------+---------+
| post_id | lat | lon |
+---------+---------+---------+
| 1 | 12.400 | NULL |
| 1 | NULL | 123.000 |
| 2 | 234.200 | NULL |
| 2 | NULL | 4.200 |
+---------+---------+---------+然后,在ID相同时,使用GROUP_BY对行进行分组,在lat和lon上使用的值将由MAX决定。由于NULL总是“较小”,因此只会选择非空值有效地将行连接到:
SELECT post_id,
MAX(IF(meta_key='geo_lat',meta_value,NULL)) lat,
MAX(IF(meta_key='geo_lon',meta_value,NULL)) lon
FROM table_1
GROUP BY post_id+---------+---------+---------+
| post_id | lat | lon |
+---------+---------+---------+
| 1 | 12.400 | 123.000 |
| 2 | 234.200 | 4.200 |
+---------+---------+---------+https://stackoverflow.com/questions/39906902
复制相似问题