mysql - 合并和求和 SQL 数据库中的数据

标签 mysql sql left-join union

所以我正在努力让系统更快。目前,我正在为一笔交易对数据库进行数千次轮询。我正在通过组合数据集/表格来加快速度。 目前我的数据库中有 4 个表:客户、食品交易、饮料交易和沙漠交易。 (这些是占位符名称)。这些设置如下:每个进入的客户都会获得一个唯一的交易号,该交易号将用于订购商品

**Customers Table:**
ID              Customer Name
0               Harvey
1               Jessica
2               Rachel
3               Louis
4               Mike
5               Donna

**Food Table**
Transaction ID  Food ID    Customer ID
1121            4          1
1122            2          0
1125            9          3
1122            7          0
1120            6          2
1122            6          0

**Drinks Table:**
Transaction ID  Drink ID   Customer ID
1121            2          1
1121            4          1
1121            4          1
1120            3          2
1125            1          3
1130            8          4
1132            8          4

**Desert Table:**
Transaction ID  Desert ID  Customer ID
1130            1          4
1125            3          3
1120            3          2
2100            9          5
1118            8          5
1118            7          5

现在我一直在尝试将这些表与FULL OUTER JOIN结合起来,但是我认为我可能错误地解释了这个函数。我可以使用 LEFT JOIN 找到相应的客户名称。

有谁知道我如何创建下表的其余部分:

**Combined Table**
Transaction IDs     Customer Name       Amount Foods     Amount Drinks     Amount Dessert
2100                Donna               0                0                 1
1132                Mike                0                1                 0
1130                Mike                0                1                 1
1125                Louis               1                1                 1
1122                Harvey              3                0                 0
1121                Jessica             1                3                 0
1120                Rachel              1                1                 1
1118                Donna               0                0                 2

一笔交易属于一个客户,但一个客户可以有多个交易 ID。因此,由于事务 ID 在最后一个表中是唯一的,我不知道在使用 LEFT JOIN 语句时将使用什么作为左表。

最佳答案

这是编写查询的另一种方式。它在外部查询中使用相关子查询而不是join:

SELECT c.`Customer ID`, c.`Customer Name`,
       (select COUNT(DISTINCT f.`Food ID`) from Food f where f.`Customer ID` = c.`ID`
       ) as "Amount Foods",
       (select COUNT(DISTINCT d.`Drink ID`) from Drink d where d.`Customer ID` = c.`ID`
       ) as "Amount Drinks",
       (select COUNT(DISTINCT d.`Desert ID`) from Desert d where d.`Customer ID` = c.`ID`
       ) as "Amount Desert",
FROM Customers c ;

这做了一些事情:

  • 当您添加更多表时,它可以防止外部级别的笛卡尔积。
  • 它消除了外部查询中对 group by 的需要。
  • 它可以确保所有客户都在场,即使他们在任何表中都没有行。

注意:我保留了count(distinct)。但是,您可能不需要它。 count(*) 应该足够了,除非您知道存在不想计算的重复值。

关于mysql - 合并和求和 SQL 数据库中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26119618/

相关文章:

mysql - 将 3 个表连接在一起 - 其中一个表返回空结果。如何在 WHERE 子句中忽略该表?

sql - MySQL LEFT JOIN 中的多个变量

php - Slim Php Mysql Put方法空值,想更新4列,但只更新了1列,但结果显示成功

php - 我的 php 表单仅保存表的最后一行。

mysql - SQL/MySQL/PostGres - 当价格更新时返回所有列和记录

sql - 如何创建使用另一个CTE作为数据进一步限制的CTE?

mysql向一列插入多列数据

php - 获取当月和下个月的记录

php - 如何仅获取一个用户的一条消息

java - 从使用 jdbc 的 java 项目创建 jar