【发布时间】:2017-10-02 20:29:01
【问题描述】:
我一直试图让 SQL 查询在我的数据库上运行,但没有太多的 SQL 知识和具有多层深度的数据库,这让我很头疼。我真的很接近我想要实现的目标,我认为这只是我误解的一个小细节。
我有一张orders 的表格,我想很好地导出它。我正在使用动态枢轴为每个purchasables.sku 生成一个新列,该列中的lineitems.qty 属于order。我只想显示属于users 的orders,其中usergroup.id 是4。然后我想显示content.field_customerReference 字段,其中content.elementId 等于orders.id。
我一直在使用this 解释并最终得到这个查询:
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
【问题讨论】:
-
我很高兴今天晚些时候再讨论这个问题,但我认为要解决我的问题,不需要了解数据库的外观。我希望有人能告诉我这样的事情:“group by 不能与 ... 结合使用,请尝试 .... 代替”
标签: mysql sql relational-database dynamic-pivot