gpt4 book ai didi

MySQL 一对多关系 : GROUP_CONCAT or JOIN or both?

转载 作者:行者123 更新时间:2023-11-30 23:32:09 25 4
gpt4 key购买 nike

我需要有关 MySQL 查询的帮助。我有三个表:

`product_category` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);

`order_products` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(255) NOT NULL,
`qty` int(11) NOT NULL,
`unit_price` decimal(11,2) NOT NULL,
`category` int(11) NOT NULL,
`order_id` int (11) NOT NULL,
PRIMARY KEY (`id`)
);

`orders` (
`id` int(11) NOT NULL auto_increment,
`date` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);

我有一个查询,按产品类别(在特定日期范围内)计算所有订单的小计。它看起来像这样:

 SELECT 
SUM(op.unit_price * op.qty) as amt,
c.name as category_name
FROM
order_products op,
product_category c,
orders o
WHERE
op.category = c.id
AND
op.order_id = o.id
AND
o.date > 'xxxxxxx'
GROUP BY
c.id

效果很好,但现在我想将单个产品及其小计添加到每一行,以便得到如下结果:

c.name|amt|op.name (1) - op.subtotal (1), op.name (2), op.subtotal (2), etc....

我发现使用 GROUP_CONCAT 我可以很容易地通过添加以下内容来显示名称:

GROUP_CONCAT(op.name) as product_name

到 SELECT 子句,但对于我来说,我无法弄清楚如何让每个产品的小计显示在产品名称旁边。我有一种感觉,它涉及嵌套在 GROUP_CONCAT 中的联接或 CONCAT 的组合,但我尝试过的任何方法都不起作用。有什么想法吗?

@piotrm 有一个想法似乎应该可行(如下),但由于某种原因它返回以下内容:

SELECT  `subtotals` 
FROM `product_category`
WHERE `c`.`category_name` = 'Fragrance'AND.`amt` = '23164.50'AND.`subtotals` = CAST( 0x6c6f76656c696c7920454454202d203631302e30302c20466f72657665726c696c79202e313235206f7a2045445020726f6c6c657262616c6c202d20313831372e35302c20666f72657665726c696c79206361636865706f74202d2039302e30302c20666f72657665726c696c7920312f38206f756e63652070617266756d206f696c20726f6c6c657262616c6c202d20313833302e30302c20666f72657665726c696c792070657266756d696e6720626f6479206c6f74696f6e202d203938312e30302c20666f72657665726c696c7920332e34206f756e6365206561752064652070617266756d207370726179202009202d203535382e30302c20666f72657665726c696c79205363656e74656420566f746976652043616e646c65202d203132302e30302c20454450202620426f6f6b20736574202d203334332e30302c20666f72657665726c696c7920332e34206f756e6365206561752064652070617266756d207370726179202d2031363831352e3030 AS
BINARY ) ;

一旦我从原始 SELECT 子句中取出 s.subtotal,它就会提取正确的产品名称。 JOIN 查询正确提取产品及其关联的 category_id 和小计。如果不在这里制造困惑,我就无法将两者放在一起。还有其他想法吗?

解决方案

@piotrm 的查询基本上是正确的,除了 GROUP_CONCAT 正在寻找一个字符串集合。所以最终的查询看起来像这样:

SELECT c.name AS category_name,
SUM( s.subtotal ) AS amt,
GROUP_CONCAT( CONCAT(s.name, ' - ', cast(s.subtotal as char) ) SEPARATOR ', ') AS subtotals
FROM
product_category c
JOIN
(SELECT op.category, op.name, sum(op.qty*op.unit_price) AS subtotal
FROM order_products op
JOIN orders o ON o.id = op.order_id
WHERE o.date > '0'
GROUP BY op.category, op.name ) s
ON s.category = c.id
GROUP BY c.name

最佳答案

从您的查询中猜测,order_products 表中还有您未在表定义中提及的 order_id 字段。您的查询应该如下所示:

SELECT c.name AS category_name,
SUM( s.subtotal ) AS amt,
GROUP_CONCAT( CONCAT(s.name, ' - ', s.subtotal ) SEPARATOR ', ' ) AS subtotals
FROM
product_category c
JOIN
( SELECT op.category, op.name, sum(op.qty*op.unit_price) AS subtotal
FROM order_products op
JOIN orders o ON o.id = op.order_id
WHERE o.date > '2012-03-31'
GROUP BY op.category, op.name ) s
ON s.category = c.id
GROUP BY c.name

虽然您的数据库架构很奇怪,但订单表看起来可以删除并且该日期移动到 order_products,因为对于每个 order_products 行,您都引用了订单表。通常它是另一种方式 - 订单表中的 product_id 字段引用的每个产品都有很多订单。订单中的日期列也是 varchar 类型 - 为什么不是日期或日期时间?

关于MySQL 一对多关系 : GROUP_CONCAT or JOIN or both?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10034494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com