【发布时间】:2021-03-17 09:42:27
【问题描述】:
我有一个由两个具有一对多关系的表组成的查询。
产品表
| product_id |
|---|
| 1234 |
Products_destinations 表
| product_id | destinations_id |
|---|---|
| 1234 | 1 |
| 1234 | 2 |
我做了一个查询来选择产品ID和所有相关的目的地,这很容易。
SELECT
p.product_id, GROUP_CONCAT(DISTINCT pd.destinations_id) as destinations_list
FROM
`products` p
INNER JOIN products_destinations pd ON pd.product_id = p.product_id
GROUP BY p.product_id
结果是:
| product_id | destinations_list |
|---|---|
| 1234 | 1,2 |
现在一个新表进入查询,它也可以与产品具有一对多关系。但是它与 products_destinations dable 没有任何关系。
Products_prices 表
| product_id | price |
|---|---|
| 1234 | 200 |
更新后的查询如下所示:
SELECT
p.product_id, GROUP_CONCAT(DISTINCT pd.destinations_id) as destinations_list, SUM(pc.price) as all_prices
FROM
`products` p
INNER JOIN products_destinations pd ON pd.product_id = p.product_id
INNER JOIN products_prices pc ON pc.product_id = p.product_id
GROUP BY p.product_id
现在最终结果如下所示:
| product_id | destinations_list | all_prices |
|---|---|---|
| 1234 | 1,2 | 400 |
如您所见,价格显示为 400 而不是 200,因为产品包含两个目的地。在这种类型的查询中是否可以计算产品价格的总和?一种解决方案是使用 SUBQUERY 来计算价格的总和,但这只是一个示例,实际表非常大且充满数据......子查询会大大增加查询时间。
更新:
"count the SUM" 英语不好,抱歉。此查询的问题在于,当产品有多个目的地时,产品价格不正确。例如,产品可以与多个目的地相关并且可以有多个价格。在同一个查询中,我需要选择目的地列表和产品的总价。在此示例中,产品的价格为 200,但因为我还需要检索目的地列表,所以我必须按产品分组,这会导致每个目的地的价格也增加。如果产品价格更高,结果会更糟。最后的结果应该是这样的:
| product_id | destinations_list | all_prices |
|---|---|---|
| 1234 | 1,2 | 200 |
而不是这个:
| product_id | destinations_list | all_prices |
|---|---|---|
| 1234 | 1,2 | 400 |
【问题讨论】:
-
“计算总和”是什么意思?您是否想在此示例中获取值
2,因为这是基于 JOINed 数据集中的 两个 记录?那么隐含地,您已经拥有该信息……您可以“计算”destinations_list包含多少个值,如果您之后在进一步处理这些查询结果时需要此信息。可能还可以添加COUNT()以直接获取该值。 -
你看过窗口函数吗?您可以按 product_id 进行分区,并找到一些从给定分区中仅添加第一行的 hacky 方法,例如。
SUM(CASE WHEN partition_row=1 THEN pc.price ELSE 0 END). -
我自己对“计算总和” 感到很困惑,但我觉得你真正想要的结果只是 200 的实际价格。如果那是在这种情况下,您可以将
SUM替换为MIN或MAX(没关系,因为价格仅取决于产品,而不取决于目的地,因此在分组的所有行中都是相同的) .如果您指定all_prices真正应该包含的内容,将会很有帮助。 -
您的
Product_prices表是否有一个主键列来区分同一产品的不同价格?或者可能是product_id, price上的复合键,这意味着特定产品没有重复价格?如果是,那么SUM(pc.price)/COUNT(DISTINCT pc.price)应该可以工作。 (或者如果你有 PK 列并允许重复价格) -
我更新了我的问题。 product_prices 和 product_destinations 表没有主键,这是一个真正的问题,但目前无法更改。
标签: php mysql sql performance