mysql - 如何简化以下 SQL 查询?

标签 mysql sql

我有一个查询可以完成我需要的所有操作,但它感觉很脆弱,而且绝对非常复杂,我很想简化它。我认为这很复杂,因为需要将行转换为元数据的列。

SELECT
  O.order_item_id,
  O.order_item_name,
  MAX(CASE WHEN OIM.meta_key = 'class' THEN OIM.meta_value END) AS 'class',
  MAX(CASE WHEN OIM.meta_key = 'fee-type' THEN OIM.meta_value END) AS 'fees',
  MAX(CASE WHEN OIM.meta_key = 'enrolment_id' THEN (
    SELECT firstname FROM wp_enrolments E WHERE OIM.meta_value=E.id) END) as 'name',
  MAX(CASE WHEN OIM.meta_key = 'enrolment_id' THEN (
    SELECT surname FROM wp_enrolments E WHERE OIM.meta_value=E.id) END) as 'surname',
  MAX(CASE WHEN OIM.meta_key = 'enrolment_Id' THEN (
    SELECT UM.meta_value
    FROM wp_usermeta UM, wp_enrolments E
    WHERE UM.meta_key='_user_phone'
    AND UM.user_id=E.memberid
    AND E.memberid=OIM.meta_value
    AND OIM.meta_key='enrolment_id' LIMIT 1) END) as 'phone',
  MAX(CASE WHEN OIM.meta_key = 'enrolment_id' THEN (
    SELECT U.user_email
    FROM wp_users U, wp_enrolments E
    WHERE U.id=E.memberid
    AND E.memberid=OIM.meta_value
    AND OIM.meta_key='enrolment_id' LIMIT 1) END) as 'email',
FROM wp_woocommerce_order_items O
INNER JOIN wp_woocommerce_order_itemmeta OIM ON O.order_item_id = OIM.order_item_id
GROUP BY O.order_item_id

最佳答案

考虑所有子查询表的LEFT JOIN,然后在CASE 语句中使用这些列。注意:如果没有数据,这还未经测试,可能需要调整,但可以帮助您重构 SQL 查询。由于不同的连接字段(idmemberid),需要两次连接wp_enrolments:

SELECT
  O.order_item_id,
  O.order_item_name,
  MAX(CASE WHEN OIM.meta_key = 'class' THEN OIM.meta_value END) AS `class`,
  MAX(CASE WHEN OIM.meta_key = 'fee-type' THEN OIM.meta_value END) AS `fees`,
  MAX(CASE WHEN OIM.meta_key = 'enrolment_id' THEN idE.firstname END) as `name`,
  MAX(CASE WHEN OIM.meta_key = 'enrolment_id' THEN idE.surname END) as `surname`,
  MAX(CASE WHEN OIM.meta_key = 'enrolment_Id' AND UM.meta_key='_user_phone' THEN UM.meta_value END) as `phone`,
  MAX(CASE WHEN OIM.meta_key = 'enrolment_id' THEN U.user_email END) as `email`

FROM wp_woocommerce_order_items O
INNER JOIN wp_woocommerce_order_itemmeta OIM 
  ON O.order_item_id = OIM.order_item_id
LEFT JOIN wp_enrolments idE
  ON OIM.meta_value = idE.id
LEFT JOIN wp_enrolments memE
  ON OIM.meta_value = memE.memberid
  AND OIM.meta_key = 'enrolment_id'
LEFT JOIN wp_users U
  ON U.id = memE.memberid
LEFT JOIN wp_usermeta UM
  ON UM.user_id = memE.memberid

GROUP BY O.order_item_id,
         O.order_item_name

关于mysql - 如何简化以下 SQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55435054/

相关文章:

mysql - MySQL 中的 ROW_NUMBER()

mysql - 有没有其他方法可以选择此 case 语句中的值而不是子查询

javascript - Node MySQL : Return a value from a column

mysql - 我正在尝试获取最近 "N"个月的订单。在下面的查询中,我需要动态设置月份的值

php - 如何在使用 JOIN 语句时按两个表中都存在的字段对行进行排序

sql - 如何在MySQL中保存唯一的字母数字内容?

c# - 如何在 C# 中以编程方式分离数据库并在本地设备中复制 db 文件

mysql - 临时表上的 Select 语句显示当前在事件表中和不在事件表中的行

php - 检测字段变化 - cakePHP

sql - 获取MySQL中具有最高值的行