我一直在尝试让 SQL 查询在我的数据库上运行,但是没有太多的 SQL 知识和具有多层深度的数据库,这让我很头疼。我真的很接近我想要实现的目标,我认为这只是我误解的一个小细节。
我有一张表orders
,我想很好地导出它。我正在使用动态枢轴为每个 生成一个新列purchasables.sku
,在该列lineitems.qty
中属于order
. 我只想表明orders
属于users
where usergroup.id
is 4
。然后我想显示equalscontent.field_customerReference
的字段。content.elementId
orders.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