3

我正在尝试编写一个 mysql 查询,但遇到了一些问题。我正在尝试从我的 Wordpress 数据库中查询 WooCommerce 数据。基本发票数据存储在 wp_posts 表中,其余数据存储在 wp_postmeta 表中。现在 wp_posts 表中的 1 个 inovice 指向 wp_postmeta 表中的多个项目。这是一个例子。

WP_POSTS

-------------------------------------------------- --
ID 状态 日期
-------------------------------------------------- --
0001 开放 01/01/2000
0002 开放 01/01/2000
0003 关闭 01/02/2000

WP_POSTMETA

-------------------------------------------------- ----------------------
ID POST_ID META_KEY META_VALUE
-------------------------------------------------- ----------------------
0001 0001 客户LN 测试
0002 0001 客户FN测试仪
0003 0001 Payment_Type 贝宝
0004 0001 发票_总计 200 美元
0005 0002 客户LN Doe
0006 0002 客户 FN 约翰
0007 0002 Payment_Type CC-万事达卡
0008 0002 发票_总计 1000 美元

我有一个基本查询,可以从 wp_posts 表中提取数据,但我不知道如何根据 META_KEY 值从第二个表中提取数据。

任何帮助都会很棒。提前致谢。

4

4 回答 4

2

首先,我会做

select a.*, b.* from WP_POSTS a, wp_postmeta b
where b.POST_ID = a.id

你做了什么?

于 2013-09-02T02:37:16.180 回答
2

对于这种情况,您想使用“JOIN”。查看http://www.w3schools.com/sql/sql_join.asp,这几乎正是您想要做的。

它会像这样结束:

SELECT *
FROM wp_posts
INNER JOIN wp_postmeta
ON wp_posts.ID=wp_postmeta.PostId;

另请注意,您的表名对于第二个表是错误的。

于 2013-09-02T02:37:53.537 回答
1

欢迎来到实体-属性-值世界。

要获得结果集的正常表示,您可能不仅需要JOIN这两个表,还PIVOT需要结果集。你可以用这样的查询来做到这一点

SELECT p.id, p.status,
       MAX(CASE WHEN m.meta_key = 'CustomerLN'    
                THEN m.meta_value END) customer_last_name,
       MAX(CASE WHEN m.meta_key = 'CustomerFN'    
                THEN m.meta_value END) customer_firt_name,
       MAX(CASE WHEN m.meta_key = 'Payment_Type'  
                THEN m.meta_value END) payment_type,
       MAX(CASE WHEN m.meta_key = 'Invoice_Total' 
                THEN m.meta_value END) invoice_total
 FROM wp_posts p LEFT JOIN wp_postmeta m
   ON p.id = m.post_id
 GROUP BY p.id, p.status

样本输出:

+--------+--------+--------+------------ --------+----------------+---------------+
| 编号 | 状态 | 客户姓氏 | customer_firt_name | 付款类型 | 发票总额 |
+--------+--------+--------+------------ --------+----------------+---------------+
| 1 | 打开 | 测试 | 测试仪 | 贝宝 | 200 美元 |
| 2 | 打开 | 能源部 | 约翰 | CC-万事达卡 | 1000 美元 |
| 3 | 关闭 | 空 | 空 | 空 | 空 |
+--------+--------+--------+------------ --------+----------------+---------------+

这是SQLFiddle演示


现在,为了能够根据元键和元值过滤您的记录,您必须使用HAVING子句

例如,如果您想获取客户 Jhon Doe 开具的发票

SELECT p.id, p.status,
       MAX(CASE WHEN m.meta_key = 'CustomerLN'    
                THEN m.meta_value END) customer_last_name,
       MAX(CASE WHEN m.meta_key = 'CustomerFN'    
                THEN m.meta_value END) customer_first_name,
       MAX(CASE WHEN m.meta_key = 'Payment_Type'  
                THEN m.meta_value END) payment_type,
       MAX(CASE WHEN m.meta_key = 'Invoice_Total' 
                THEN m.meta_value END) invoice_total
 FROM wp_posts p LEFT JOIN wp_postmeta m
   ON p.id = m.post_id
 GROUP BY p.id, p.status
HAVING customer_last_name = 'Doe'
   AND customer_first_name = 'John'

输出:

+--------+--------+--------+------------ ---------+---------------+----------------+
| 编号 | 状态 | 客户姓氏 | 客户名字 | 付款类型 | 发票总额 |
+--------+--------+--------+------------ ---------+---------------+----------------+
| 2 | 打开 | 能源部 | 约翰 | CC-万事达卡 | 1000 美元 |
+--------+--------+--------+------------ ---------+---------------+----------------+

这是SQLFiddle演示

于 2013-09-02T03:14:03.253 回答
0

首先,您不应该尝试 JOIN 两个表,因为它们的表结构不同。让我们创建一个使用 的数据的视图,WP_POSTMETA并对其进行整合。

对于您感兴趣的每个 X 字段,将其自身连接WP_POSTMETAX-1 次会为每个Post_ID. 使用该WHERE子句从表的每个副本中获取 1 列,并将每行的总行数减少Post_ID到 1(或无)。

过滤掉垃圾,瞧!

注意: [table_name2]可以被调用temp0[table_name3]被调用temp1,被[table_name4]调用temp2,或者任何你想要的。

SELECT WP_POSTMETA.Post_ID AS Post_ID, WP_POSTMETA.CustomerLN AS CustomerLN, [table_name2].CustomerFN AS  CustomerFN, [table_name3].Payment_Type AS Payment_Type, [table_name4].Meta_Value AS  Invoice_Total 
FROM WP_POSTMETA 
JOIN WP_POSTMETA AS [table_name2] ON WP_POSTMETA.Post_ID = [table_name2].Post_ID 
JOIN WP_POSTMETA AS [table_name3] ON WP_POSTMETA.Post_ID = [table_name3].Post_ID 
JOIN WP_POSTMETA AS [table_name4] ON WP_POSTMETA.Post_ID = [table_name4].Post_ID 
WHERE WP_POSTMETA.Meta_Value =  "CustomerLN"
AND [table_name2].Meta_Value =  "CustomerFN"
AND [table_name3].Meta_Value =  "Payment_Type"
AND [table_name4].Meta_Value =  "Invoice_Total"

这将生成一个输出,可以view通过前置

CREATE VIEW WP_TRANSACTIONS AS

这个视图JOIN编辑到 WP_POST

SELECT * FROM WP_POST 
LEFT JOIN WP_TRANSACTIONS ON WP_POST.Post_ID = WP_TRANSACTIONS.Post_ID
于 2017-01-31T11:21:50.520 回答