1

我一直在尝试让 SQL 查询在我的数据库上运行,但是没有太多的 SQL 知识和具有多层深度的数据库,这让我很头疼。我真的很接近我想要实现的目标,我认为这只是我误解的一个小细节。

我有一张表orders,我想很好地导出它。我正在使用动态枢轴为每个 生成一个新列purchasables.sku,在该列lineitems.qty中属于order. 我只想表明orders属于userswhere usergroup.idis 4。然后我想显示equalscontent.field_customerReference的字段。content.elementIdorders.id

我一直在使用这个解释,最后得到了这个查询:

SET @@group_concat_max_len = 32000;
SET @sql = NULL;

SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(IF(purchasables.sku = ''',
      purchasables.sku,
      ''', lineitems.qty, NULL)) AS ',
      CONCAT("'", purchasables.sku, "'")
    )
  ) INTO @sql
FROM craft_commerce_orders AS orders
JOIN craft_commerce_customers AS customers
  on customers.id = orders.customerId
JOIN craft_users AS users
  on users.id = customers.userId
JOIN craft_commerce_lineitems AS lineitems
    ON lineitems.orderId = orders.id
JOIN craft_commerce_purchasables AS purchasables
    ON purchasables.id = lineitems.purchasableId
JOIN craft_content AS content
    ON content.elementId = orders.id
JOIN craft_usergroups_users AS usergroup_users
    ON usergroup_users.userId = users.id
WHERE usergroup_users.groupId = 4
GROUP BY orders.id;

SET @sql = CONCAT(
    'SELECT 
        orders.dateCreated AS Datum,
        orders.id AS ID,
        users.firstName AS Gebruiker,
        content.field_customerReference AS Referentie,
        ', @sql, '
      FROM craft_commerce_orders AS orders
    JOIN craft_commerce_customers AS customers
        on customers.id = orders.customerId
    JOIN craft_users AS users
        on users.id = customers.userId
    JOIN craft_commerce_lineitems AS lineitems
        ON lineitems.orderId = orders.id
    JOIN craft_commerce_purchasables AS purchasables
        ON purchasables.id = lineitems.purchasableId
    JOIN craft_content AS content
        ON content.elementId = orders.id
    JOIN craft_usergroups_users AS usergroup_users
        ON usergroup_users.userId = users.id
    WHERE usergroup_users.groupId = 4
    GROUP BY orders.id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

这给出了错误1172 'Result consisted of more than one row'。它可以在没有的情况下工作GROUP BY orders.id,但随后会将所有结果组合成一行。我希望每个订单都是单独的行。如果我删除动态枢轴并sku手动填写,它可以工作:

SELECT orders.dateCreated,
       orders.id,
       users.firstName,
       MAX(IF(purchasables.sku = '999992', lineitems.qty, NULL)) as '999992',
       MAX(IF(purchasables.sku = '9999991', lineitems.qty, NULL)) as '9999991',
       content.field_customerReference
FROM craft_commerce_orders AS orders
JOIN craft_commerce_customers AS customers
  on customers.id = orders.customerId
JOIN craft_users AS users
  on users.id = customers.userId
JOIN craft_commerce_lineitems AS lineitems
    ON lineitems.orderId = orders.id
JOIN craft_commerce_purchasables AS purchasables
    ON purchasables.id = lineitems.purchasableId
JOIN craft_content AS content
    ON content.elementId = orders.id
JOIN craft_usergroups_users AS usergroup_users
    ON usergroup_users.userId = users.id
WHERE usergroup_users.groupId = 4
GROUP BY orders.id

任何帮助表示赞赏。

编辑:这是我在霍根的建议后运行的查询:

SET @sql = NULL;

SELECT
  GROUP_CONCAT(DISTINCT X.X) INTO @sql
FROM 
(
  SELECT DISTINCT
      CONCAT(
        'MAX(IF(purchasables.sku = ''',
        purchasables.sku,
        ''', lineitems.qty, NULL)) AS ''',
        purchasables.sku, '''' ) as X
  FROM craft_commerce_orders AS orders
  JOIN craft_commerce_customers AS customers on customers.id = orders.customerId
  JOIN craft_users AS users on users.id = customers.userId
  JOIN craft_commerce_lineitems AS lineitems ON lineitems.orderId = orders.id
  JOIN craft_commerce_purchasables AS purchasables ON purchasables.id = lineitems.purchasableId
  JOIN craft_content AS content ON content.elementId = orders.id
  JOIN craft_usergroups_users AS usergroup_users ON usergroup_users.userId = users.id
  WHERE usergroup_users.groupId = 4
) AS X;

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

这给出了错误

1064 you have an error in your sql syntax near 'MAX(IF(purchasables.sku = '999992', lineitems.qty, NULL)) AS '999992',MAX(IF(pur' at line 1
4

1 回答 1

0

这里我做了一个单独的子查询。如果仍然出现错误,您可以自行测试 - 我认为问题出在"s

SELECT
  GROUP_CONCAT(DISTINCT X.X) INTO @sql
FROM 
(
  SELECT DISTINCT
      CONCAT(
        'MAX(IF(purchasables.sku = ''',
        purchasables.sku,
        ''', lineitems.qty, NULL)) AS ''',
        purchasables.sku, '''' ) as X
  FROM craft_commerce_orders AS orders
  JOIN craft_commerce_customers AS customers on customers.id = orders.customerId
  JOIN craft_users AS users on users.id = customers.userId
  JOIN craft_commerce_lineitems AS lineitems ON lineitems.orderId = orders.id
  JOIN craft_commerce_purchasables AS purchasables ON purchasables.id = lineitems.purchasableId
  JOIN craft_content AS content ON content.elementId = orders.id
  JOIN craft_usergroups_users AS usergroup_users ON usergroup_users.userId = users.id
  WHERE usergroup_users.groupId = 4
) AS X
于 2017-10-02T20:58:26.777 回答