寻找一些建议来完成针对 3 个不同表的自定义 mysql 查询
Looking for some advice to complete custom mysql query against 3 different tables
我想创建一个查询,通过查询包含条目相关信息的 3 个数据库来动态填充 table。
wp_gf_entry、wp_gf_entry_meta,以及(理想情况下)与 wp_posts
查询正在使用 wp_gf_entry 和 wp_gf_entry_meta tables。
SELECT DISTINCT
t2.id,
MAX(CASE WHEN t1.`meta_key` = '1.3' THEN t1.meta_value END) firstname,
MAX(CASE WHEN t1.`meta_key` = '1.6' THEN t1.meta_value END) lastname,
MAX(CASE WHEN t1.`meta_key` = '5.4' THEN t1.meta_value END) state,
MAX(CASE WHEN t1.`meta_key` LIKE '%45.%' THEN t1.meta_value END) division
FROM
`wp_gf_entry_meta` t1
LEFT JOIN `wp_gf_entry` t2
ON (
t1.`entry_id` = t2.`id`
)
WHERE (
t2.`form_id` = 71
AND t2.`is_read` = 1 AND t2.`status` = 'active'
AND t1.`meta_key` IN ('1.3', '1.6', '5.4', '45.1', '45.2', '45.3', '45.4', '45.5', '45.6')
)
GROUP BY t2.`id`
ORDER BY
t1.`id` ASC,
t1.`entry_id` ASC
这很有效,如果条目是 'read' 而条目不是 'trashed'。
+-----+-----------+----------+-------+------------------------------+
| id | firstname | lastname | state | division |
+-----+-----------+----------+-------+------------------------------+
| 166 | Steve | Jobs | QLD | (null) |
| 253 | Bill | Clinton | NSW | (null) |
| 427 | Maria | McOldguy | VIC | Grand Master's (65 and over) |
| 447 | Some | Bloke | NSW | Master's (60-64) |
+-----+-----------+----------+-------+------------------------------+
但此查询仍然需要人工每天多次与网站交互以处理条目(将其标记为已读)——因为无论条目是否已成功支付,条目仍会写入数据库.
这是我想查询 wp_posts table 的地方,使用每个条目的 wp_gf_entry_meta 行中存储的 woocommerce_order_number 键和值对。
因此将查询修改为将 woocommerce_order_number 拉入数组,我认为可以查询的内容:
SELECT DISTINCT
t2.id,
MAX(CASE WHEN t1.`meta_key` = 'woocommerce_order_number' THEN t1.meta_value END) wcID,
MAX(CASE WHEN t1.`meta_key` = '1.3' THEN t1.meta_value END) firstname,
MAX(CASE WHEN t1.`meta_key` = '1.6' THEN t1.meta_value END) lastname,
MAX(CASE WHEN t1.`meta_key` = '5.4' THEN t1.meta_value END) state,
MAX(CASE WHEN t1.`meta_key` LIKE '%45.%' THEN t1.meta_value END) division
FROM
`wp_gf_entry_meta` t1
LEFT JOIN `wp_gf_entry` t2
ON (
t1.`entry_id` = t2.`id`
)
WHERE (
t2.`form_id` = 71
AND t2.`is_read` = 1 AND t2.`status` = 'active'
AND t1.`meta_key` IN ('1.3', '1.6', '5.4', '45.1', '45.2', '45.3', '45.4', '45.5', '45.6', 'woocommerce_order_number')
)
GROUP BY t2.`id`
ORDER BY
t1.`id` ASC,
t1.`entry_id` ASC
上面的查询给了我一个包含 woocommerce 订单的列:
+-----+------+-----------+----------+-------+------------------------------+
| id | wcID | firstname | lastname | state | division |
+-----+------+-----------+----------+-------+------------------------------+
| 166 | 1 | Steve | Jobs | QLD | (null) |
| 253 | 2 | Bill | Clinton | NSW | (null) |
| 427 | 3 | Maria | McOldguy | VIC | Grand Master's (65 and over) |
| 447 | 4 | Some | Bloke | NSW | Master's (60-64) |
+-----+------+-----------+----------+-------+------------------------------+
但是,我想通过在 WHERE 语句中添加以下内容来消除人为因素
AND t1.`meta_value` IN (SELECT t3.ID FROM wp_posts t3 WHERE t3.ID = 'wcID' AND t3.`post_status` IN ('wc-processing', 'wc-completed', 'wc-free-of-charge') AND t3.`post_type` = 'shop_order' )
导致此错误消息 "Warning: #1292 Truncated incorrect DOUBLE value: 'wcID'"。
而且我不太确定如何巧妙地处理这个最终的 AND 语句。
有没有办法使用 woocommerce_order_number 别名 wcID 查询 wp_posts table 和 ID 列?
Akina 在这里回答了这个问题Database Administrators
下面是最终的工作 sql 查询:
SELECT
t2.id,
MAX(CASE WHEN t1.`meta_key` = '1.3' THEN t1.meta_value END) firstname,
MAX(CASE WHEN t1.`meta_key` = '1.6' THEN t1.meta_value END) lastname,
MAX(CASE WHEN t1.`meta_key` = '5.4' THEN t1.meta_value END) state,
MAX(CASE WHEN t1.`meta_key` LIKE '%45.%' THEN t1.meta_value END) division
FROM wp_gf_entry_meta t1
LEFT JOIN wp_gf_entry t2
ON t1.entry_id = t2.id
LEFT JOIN ( SELECT t3.ID
FROM wp_posts t3
WHERE t3.`post_status` IN ('wc-processing', 'wc-completed', 'wc-free-of-charge')
AND t3.`post_type` = 'shop_order' ) t4
ON t1.`meta_key` = 'woocommerce_order_number' AND t1.meta_value = t4.ID
WHERE t2.`form_id` = 71
AND t2.`status` = 'active'
AND t1.`meta_key` IN ('1.3', '1.6', '5.4', '45.1', '45.2', '45.3', '45.4', '45.5', '45.6', 'woocommerce_order_number')
GROUP BY t2.id
我想创建一个查询,通过查询包含条目相关信息的 3 个数据库来动态填充 table。
wp_gf_entry、wp_gf_entry_meta,以及(理想情况下)与 wp_posts
查询正在使用 wp_gf_entry 和 wp_gf_entry_meta tables。
SELECT DISTINCT
t2.id,
MAX(CASE WHEN t1.`meta_key` = '1.3' THEN t1.meta_value END) firstname,
MAX(CASE WHEN t1.`meta_key` = '1.6' THEN t1.meta_value END) lastname,
MAX(CASE WHEN t1.`meta_key` = '5.4' THEN t1.meta_value END) state,
MAX(CASE WHEN t1.`meta_key` LIKE '%45.%' THEN t1.meta_value END) division
FROM
`wp_gf_entry_meta` t1
LEFT JOIN `wp_gf_entry` t2
ON (
t1.`entry_id` = t2.`id`
)
WHERE (
t2.`form_id` = 71
AND t2.`is_read` = 1 AND t2.`status` = 'active'
AND t1.`meta_key` IN ('1.3', '1.6', '5.4', '45.1', '45.2', '45.3', '45.4', '45.5', '45.6')
)
GROUP BY t2.`id`
ORDER BY
t1.`id` ASC,
t1.`entry_id` ASC
这很有效,如果条目是 'read' 而条目不是 'trashed'。
+-----+-----------+----------+-------+------------------------------+
| id | firstname | lastname | state | division |
+-----+-----------+----------+-------+------------------------------+
| 166 | Steve | Jobs | QLD | (null) |
| 253 | Bill | Clinton | NSW | (null) |
| 427 | Maria | McOldguy | VIC | Grand Master's (65 and over) |
| 447 | Some | Bloke | NSW | Master's (60-64) |
+-----+-----------+----------+-------+------------------------------+
但此查询仍然需要人工每天多次与网站交互以处理条目(将其标记为已读)——因为无论条目是否已成功支付,条目仍会写入数据库.
这是我想查询 wp_posts table 的地方,使用每个条目的 wp_gf_entry_meta 行中存储的 woocommerce_order_number 键和值对。
因此将查询修改为将 woocommerce_order_number 拉入数组,我认为可以查询的内容:
SELECT DISTINCT
t2.id,
MAX(CASE WHEN t1.`meta_key` = 'woocommerce_order_number' THEN t1.meta_value END) wcID,
MAX(CASE WHEN t1.`meta_key` = '1.3' THEN t1.meta_value END) firstname,
MAX(CASE WHEN t1.`meta_key` = '1.6' THEN t1.meta_value END) lastname,
MAX(CASE WHEN t1.`meta_key` = '5.4' THEN t1.meta_value END) state,
MAX(CASE WHEN t1.`meta_key` LIKE '%45.%' THEN t1.meta_value END) division
FROM
`wp_gf_entry_meta` t1
LEFT JOIN `wp_gf_entry` t2
ON (
t1.`entry_id` = t2.`id`
)
WHERE (
t2.`form_id` = 71
AND t2.`is_read` = 1 AND t2.`status` = 'active'
AND t1.`meta_key` IN ('1.3', '1.6', '5.4', '45.1', '45.2', '45.3', '45.4', '45.5', '45.6', 'woocommerce_order_number')
)
GROUP BY t2.`id`
ORDER BY
t1.`id` ASC,
t1.`entry_id` ASC
上面的查询给了我一个包含 woocommerce 订单的列:
+-----+------+-----------+----------+-------+------------------------------+
| id | wcID | firstname | lastname | state | division |
+-----+------+-----------+----------+-------+------------------------------+
| 166 | 1 | Steve | Jobs | QLD | (null) |
| 253 | 2 | Bill | Clinton | NSW | (null) |
| 427 | 3 | Maria | McOldguy | VIC | Grand Master's (65 and over) |
| 447 | 4 | Some | Bloke | NSW | Master's (60-64) |
+-----+------+-----------+----------+-------+------------------------------+
但是,我想通过在 WHERE 语句中添加以下内容来消除人为因素
AND t1.`meta_value` IN (SELECT t3.ID FROM wp_posts t3 WHERE t3.ID = 'wcID' AND t3.`post_status` IN ('wc-processing', 'wc-completed', 'wc-free-of-charge') AND t3.`post_type` = 'shop_order' )
导致此错误消息 "Warning: #1292 Truncated incorrect DOUBLE value: 'wcID'"。
而且我不太确定如何巧妙地处理这个最终的 AND 语句。
有没有办法使用 woocommerce_order_number 别名 wcID 查询 wp_posts table 和 ID 列?
Akina 在这里回答了这个问题Database Administrators
下面是最终的工作 sql 查询:
SELECT
t2.id,
MAX(CASE WHEN t1.`meta_key` = '1.3' THEN t1.meta_value END) firstname,
MAX(CASE WHEN t1.`meta_key` = '1.6' THEN t1.meta_value END) lastname,
MAX(CASE WHEN t1.`meta_key` = '5.4' THEN t1.meta_value END) state,
MAX(CASE WHEN t1.`meta_key` LIKE '%45.%' THEN t1.meta_value END) division
FROM wp_gf_entry_meta t1
LEFT JOIN wp_gf_entry t2
ON t1.entry_id = t2.id
LEFT JOIN ( SELECT t3.ID
FROM wp_posts t3
WHERE t3.`post_status` IN ('wc-processing', 'wc-completed', 'wc-free-of-charge')
AND t3.`post_type` = 'shop_order' ) t4
ON t1.`meta_key` = 'woocommerce_order_number' AND t1.meta_value = t4.ID
WHERE t2.`form_id` = 71
AND t2.`status` = 'active'
AND t1.`meta_key` IN ('1.3', '1.6', '5.4', '45.1', '45.2', '45.3', '45.4', '45.5', '45.6', 'woocommerce_order_number')
GROUP BY t2.id