2013-04-26 67 views
3

我有下面的查询获取我需要的行的ID。将查询合并到列

SELECT `wp_posts`.`ID`, `wp_posts`.`post_modified_gmt`, `wp_term_relationships`.`term_taxonomy_id` 
FROM `wp_posts` 
LEFT JOIN `wp_term_relationships` ON 
`wp_posts`.`ID` = `wp_term_relationships`.`object_id` 
WHERE `wp_posts`.`post_type` = 'shop_order' 
AND `wp_term_relationships`.`term_taxonomy_id` = 14 
AND `wp_posts`.`post_modified` > '2013-04-25 16:02:00' 
ORDER BY `wp_posts`.`post_modified` ASC; 

+----+---------------------+------------------+ 
| ID | post_modified  | term_taxonomy_id | 
+----+---------------------+------------------+ 
| 41 | 2013-04-25 16:02:43 |    14 | 
| 43 | 2013-04-25 18:40:37 |    14 | 
+----+---------------------+------------------+ 
2 rows in set (0.00 sec) 

我再通过所有ID的循环,并运行下面使用ID匹配查询POST_ID查询。

SELECT `wp_postmeta`.`post_id`, `wp_postmeta`.`meta_key`, `wp_postmeta`.`meta_value` 
FROM `wp_postmeta` 
WHERE `post_id` = 43 # ID from last query 
AND (`wp_postmeta`.`meta_key` = '_shipping_first_name' 
OR `wp_postmeta`.`meta_key` = '_shipping_last_name' 
OR `wp_postmeta`.`meta_key` = '_shipping_address_1' 
OR `wp_postmeta`.`meta_key` = '_shipping_address_2' 
OR `wp_postmeta`.`meta_key` = '_shipping_city' 
OR `wp_postmeta`.`meta_key` = '_shipping_state' 
OR `wp_postmeta`.`meta_key` = '_shipping_postcode' 
OR `wp_postmeta`.`meta_key` = '_shipping_country' 
OR `wp_postmeta`.`meta_key` = '_order_total' 
OR `wp_postmeta`.`meta_key` = '_order_shipping' 
OR `wp_postmeta`.`meta_key` = '_order_discount' 
OR `wp_postmeta`.`meta_key` = '_cart_discount' 
OR `wp_postmeta`.`meta_key` = '_order_tax' 
OR `wp_postmeta`.`meta_key` = '_order_shipping_tax'); 

+---------+----------------------+------------------+ 
| post_id | meta_key    | meta_value  | 
+---------+----------------------+------------------+ 
|  43 | _shipping_country | GB    | 
|  43 | _shipping_first_name | Joe    | 
|  43 | _shipping_last_name | Bloggs   | 
|  43 | _shipping_address_1 | 18 Street Name | 
|  43 | _shipping_address_2 |     | 
|  43 | _shipping_city  | Manchester  | 
|  43 | _shipping_state  | Lancashire  | 
|  43 | _shipping_postcode | MM1 1MM   | 
|  43 | _order_shipping  | 0.00    | 
|  43 | _order_discount  | 0.00    | 
|  43 | _cart_discount  | 0.00    | 
|  43 | _order_tax   | 0.00    | 
|  43 | _order_shipping_tax | 0.00    | 
|  43 | _order_total   | 224.00   | 
+---------+----------------------+------------------+ 
14 rows in set (0.00 sec) 

我想知道是否有一种方法来合并这些查询,所以我减半查询我的服务器的数量。

我不确定您是否可以这样做,但我想将meta_key的值更改为列的名称并将meta_value用作值?

最终结果例如

+----+---------------------+------------------+-------------------+----------------------+---------------------+---------------------+---------------------+----------------+-----------------+--------------------+-----------------+-----------------+----------------+------------+---------------------+--------------+ 
| ID | post_modified  | term_taxonomy_id | _shipping_country | _shipping_first_name | _shipping_last_name | _shipping_address_1 | _shipping_address_2 | _shipping_city | _shipping_state | _shipping_postcode | _order_shipping | _order_discount | _cart_discount | _order_tax | _order_shipping_tax | _order_total | 
+----+---------------------+------------------+-------------------+----------------------+---------------------+---------------------+---------------------+----------------+-----------------+--------------------+-----------------+-----------------+----------------+------------+---------------------+--------------+ 
| 43 | 2013-04-25 18:40:37 |    14 | GB    | Joe     | Bloggs    | 18 Street Name  |      | Manchester  | Lancashire  | MM1 1MM   | 0.00   | 0.00   | 0.00   | 0.00  | 0.00    | 224.00  | 
+----+---------------------+------------------+-------------------+----------------------+---------------------+---------------------+---------------------+----------------+-----------------+--------------------+-----------------+-----------------+----------------+------------+---------------------+--------------+ 
Next row... 
Next row... 

任何帮助将是巨大的。

感谢

编辑

随着meewoK这个的帮助是对我工作的查询。

SELECT (CASE WHEN `wp_postmeta`.`meta_key` = '_shipping_first_name' THEN `wp_postmeta`.`meta_value` ELSE NULL END) AS '_shipping_first_name', 
    (CASE WHEN `wp_postmeta`.`meta_key` = '_shipping_last_name' THEN `wp_postmeta`.`meta_value` ELSE NULL END) AS '_shipping_last_name', 
    (CASE WHEN `wp_postmeta`.`meta_key` = '_shipping_address_1' THEN `wp_postmeta`.`meta_value` ELSE NULL END) AS '_shipping_address_1', 
    (CASE WHEN `wp_postmeta`.`meta_key` = '_shipping_address_2' THEN `wp_postmeta`.`meta_value` ELSE NULL END) AS '_shipping_address_2', 
    (CASE WHEN `wp_postmeta`.`meta_key` = '_shipping_city' THEN `wp_postmeta`.`meta_value` ELSE NULL END) AS '_shipping_city', 
    (CASE WHEN `wp_postmeta`.`meta_key` = '_shipping_state' THEN `wp_postmeta`.`meta_value` ELSE NULL END) AS '_shipping_state', 
    (CASE WHEN `wp_postmeta`.`meta_key` = '_shipping_postcode' THEN `wp_postmeta`.`meta_value` ELSE NULL END) AS '_shipping_postcode', 
    (CASE WHEN `wp_postmeta`.`meta_key` = '_shipping_country' THEN `wp_postmeta`.`meta_value` ELSE NULL END) AS '_shipping_country', 
    (CASE WHEN `wp_postmeta`.`meta_key` = '_order_total' THEN `wp_postmeta`.`meta_value` ELSE NULL END) AS '_order_total', 
    (CASE WHEN `wp_postmeta`.`meta_key` = '_order_shipping' THEN `wp_postmeta`.`meta_value` ELSE NULL END) AS '_order_shipping', 
    (CASE WHEN `wp_postmeta`.`meta_key` = '_order_discount' THEN `wp_postmeta`.`meta_value` ELSE NULL END) AS '_order_discount', 
    (CASE WHEN `wp_postmeta`.`meta_key` = '_cart_discount' THEN `wp_postmeta`.`meta_value` ELSE NULL END) AS '_cart_discount', 
    (CASE WHEN `wp_postmeta`.`meta_key` = '_order_tax' THEN `wp_postmeta`.`meta_value` ELSE NULL END) AS '_order_tax', 
    (CASE WHEN `wp_postmeta`.`meta_key` = '_order_shipping_tax' THEN `wp_postmeta`.`meta_value` ELSE NULL END) AS '_order_shipping_tax', 
    `wp_posts`.`ID`, 
    `wp_posts`.`post_modified_gmt`, 
    `wp_term_relationships`.`term_taxonomy_id` 
FROM `wp_postmeta`, `wp_posts` 
LEFT JOIN `wp_term_relationships` ON `wp_posts`.`ID` = `wp_term_relationships`.`object_id` 
WHERE `wp_posts`.`post_type` = 'shop_order' 
    AND `wp_term_relationships`.`term_taxonomy_id` = 14 
    AND `wp_posts`.`post_modified` > '2013-04-25 16:02:00' 
    AND `post_id` = `wp_posts`.`ID` 
    AND (`wp_postmeta`.`meta_key` = '_shipping_first_name' 
     OR `wp_postmeta`.`meta_key` = '_shipping_last_name' 
     OR `wp_postmeta`.`meta_key` = '_shipping_address_1' 
     OR `wp_postmeta`.`meta_key` = '_shipping_address_2' 
     OR `wp_postmeta`.`meta_key` = '_shipping_city' 
     OR `wp_postmeta`.`meta_key` = '_shipping_state' 
     OR `wp_postmeta`.`meta_key` = '_shipping_postcode' 
     OR `wp_postmeta`.`meta_key` = '_shipping_country' 
     OR `wp_postmeta`.`meta_key` = '_order_total' 
     OR `wp_postmeta`.`meta_key` = '_order_shipping' 
     OR `wp_postmeta`.`meta_key` = '_order_discount' 
     OR `wp_postmeta`.`meta_key` = '_cart_discount' 
     OR `wp_postmeta`.`meta_key` = '_order_tax' 
     OR `wp_postmeta`.`meta_key` = '_order_shipping_tax') 
GROUP BY `wp_posts`.`ID` 
ORDER BY `wp_posts`.`post_modified` ASC; 

最终结果例如

+----+---------------------+------------------+-------------------+----------------------+---------------------+---------------------+---------------------+----------------+-----------------+--------------------+-----------------+-----------------+----------------+------------+---------------------+--------------+ 
| ID | post_modified  | term_taxonomy_id | _shipping_country | _shipping_first_name | _shipping_last_name | _shipping_address_1 | _shipping_address_2 | _shipping_city | _shipping_state | _shipping_postcode | _order_shipping | _order_discount | _cart_discount | _order_tax | _order_shipping_tax | _order_total | 
+----+---------------------+------------------+-------------------+----------------------+---------------------+---------------------+---------------------+----------------+-----------------+--------------------+-----------------+-----------------+----------------+------------+---------------------+--------------+ 
| 43 | 2013-04-25 18:40:37 |    14 | GB    | Joe     | Bloggs    | 18 Street Name  |      | Manchester  | Lancashire  | MM1 1MM   | 0.00   | 0.00   | 0.00   | 0.00  | 0.00    | 224.00  | 
+----+---------------------+------------------+-------------------+----------------------+---------------------+---------------------+---------------------+----------------+-----------------+--------------------+-----------------+-----------------+----------------+------------+---------------------+--------------+ 
Next row... 
Next row... 
+0

检查到转置..发现的东西在:http://stackoverflow.com/questions/3392956/sql-how-to-transpose,但它看起来很乱... – 2013-04-26 14:21:51

+0

因为mysql不支持本地转置/旋转解决方案比你想要的更复杂。 BBL:http://stackoverflow.com/questions/13581482/transpose-mysql-query-need-rows-into-columns – 2013-04-26 14:24:30

+0

我更新了我的答案做案例的关键。试试看,并告诉我:) – 2013-04-26 17:03:20

回答

0

这需要加入让它在一个查询工作。 事情是这样的:

SELECT `wp_posts`.`ID`, 
     `wp_posts`.`post_modified_gmt`, 
     `wp_term_relationships`.`term_taxonomy_id`, 
     `wp_postmeta`.`post_id`, 
     `wp_postmeta`.`meta_key`, 
     `wp_postmeta`.`meta_value` 
FROM `wp_postmeta`, `wp_posts` 
LEFT JOIN `wp_term_relationships` ON `wp_posts`.`ID` = `wp_term_relationships`.`object_id` 
WHERE `wp_posts`.`post_type` = 'shop_order' 
    AND `wp_term_relationships`.`term_taxonomy_id` = 14 
    AND `wp_posts`.`post_modified` > '2013-04-25 16:02:00' 
    AND `post_id` = `wp_posts`.`ID` 
    AND (`wp_postmeta`.`meta_key` = '_shipping_first_name' 
     OR `wp_postmeta`.`meta_key` = '_shipping_last_name' 
     OR `wp_postmeta`.`meta_key` = '_shipping_address_1' 
     OR `wp_postmeta`.`meta_key` = '_shipping_address_2' 
     OR `wp_postmeta`.`meta_key` = '_shipping_city' 
     OR `wp_postmeta`.`meta_key` = '_shipping_state' 
     OR `wp_postmeta`.`meta_key` = '_shipping_postcode' 
     OR `wp_postmeta`.`meta_key` = '_shipping_country' 
     OR `wp_postmeta`.`meta_key` = '_order_total' 
     OR `wp_postmeta`.`meta_key` = '_order_shipping' 
     OR `wp_postmeta`.`meta_key` = '_order_discount' 
     OR `wp_postmeta`.`meta_key` = '_cart_discount' 
     OR `wp_postmeta`.`meta_key` = '_order_tax' 
     OR `wp_postmeta`.`meta_key` = '_order_shipping_tax') 
ORDER BY `wp_posts`.`post_modified` ASC; 

编辑:

关于要求能进行旋转,我会用以下内容。你将不得不硬编码每个可能的meta_key的情况....

select (CASE WHEN `wp_postmeta`.`meta_key` = '_shipping_first_name' THEN `wp_postmeta`.`meta_key` ELSE NULL END) AS '_shipping_first_name', 
(CASE WHEN `wp_postmeta`.`meta_key` = '_shipping_address_1' THEN `wp_postmeta`.`meta_key` ELSE NULL END) AS '_shipping_address_1', 
(CASE WHEN `wp_postmeta`.`meta_key` = '_shipping_address_2' THEN `wp_postmeta`.`meta_key` ELSE NULL END) AS '_shipping_address_2', 
... 

等等。

+0

获取错误“#1054 - 'on'子句'中的未知列'wp_posts.ID'”我还在离开连接之前删除了逗号,因为它抛出错误任何想法出什么问题了吗 – arbme 2013-04-26 13:58:01

+0

是的,修正了答案,LEFT JOIN需要在'wp_posts'之后,因为连接在'wp_posts'.'ID' =上,并且在尝试左键连接wp_postmeta和term_relationships并且没有ID在wp_postmeta中,我现在修复了它。 – 2013-04-26 14:00:42

+0

我已编辑我的帖子以显示我得到的输出,是否没有办法将meta_key值转换为列名称?谢谢 – arbme 2013-04-26 14:16:15

0

你可以试试这个:

SELECT `wp_postmeta`.`post_id`, `wp_postmeta`.`meta_key`, 
    `wp_postmeta`.`meta_value` 
FROM `wp_postmeta` 
WHERE `post_id` in (
    SELECT `wp_posts`.`ID` 
    FROM `wp_posts` 
    LEFT JOIN `wp_term_relationships` ON 
     `wp_posts`.`ID` = `wp_term_relationships`.`object_id` 
    WHERE `wp_posts`.`post_type` = 'shop_order' 
    AND `wp_term_relationships`.`term_taxonomy_id` = 14 
    AND `wp_posts`.`post_modified` > '2013-04-25 16:02:00' 
    ORDER BY `wp_posts`.`post_modified` ASC) 
AND `wp_postmeta`.`meta_key` in ('_shipping_first_name', '_shipping_last_name' 
    '_shipping_address_1', '_shipping_address_2', '_shipping_city' 
    '_shipping_state', '_shipping_postcode', '_shipping_country' 
    '_order_total', '_order_shipping', '_order_discount' 
    '_cart_discount', '_order_tax', '_order_shipping_tax'); 
+0

不工作得到错误,我想它,所以我没有ID('post_id' = 43)从它的第一个查询。 #1064 - 你的SQL语法错误;检查与您的MySQL服务器版本相对应的手册,以便在第4行的'from(SELECT'wp_posts'.'''','wp_posts'.'post_modified_gmt','wp')附近使用正确的语法 – arbme 2013-04-26 13:54:32

+0

@arbme我现在明白了,请参阅我的更新回答... – DarkAjax 2013-04-26 14:05:10