简体   繁体   English

SQL查询连接三个表

[英]SQL Queries to join three tables

I have three tables with following structure and info: 我有三个表,其结构和信息如下:

CREATE TABLE customer (
  customer_id mediumint(8) unsigned NOT NULL auto_increment,
  name varchar(50) NOT NULL,
  PRIMARY KEY (customer_id)
);

INSERT INTO customer VALUES (1, 'Dagmar');
INSERT INTO customer VALUES (2, 'Dietmar');
INSERT INTO customer VALUES (3, 'Sabine');

CREATE TABLE sales_cars (
  sale_id mediumint(8) unsigned NOT NULL auto_increment,
  customer_id mediumint(8) unsigned NOT NULL,
  sale_amount decimal(10,2) NOT NULL,
  PRIMARY KEY (sale_id)
);

INSERT INTO sales_cars VALUES (1, 3, 14.40);
INSERT INTO sales_cars VALUES (2, 1, 28.30);
INSERT INTO sales_cars VALUES (3, 2, 34.40);
INSERT INTO sales_cars VALUES (4, 2, 25.60);

CREATE TABLE sales_parts (
  sale_id mediumint(8) unsigned NOT NULL auto_increment,
  customer_id mediumint(8) unsigned NOT NULL,
  sale_amount decimal(10,2) NOT NULL,
  PRIMARY KEY (sale_id)
);

INSERT INTO sales_parts VALUES (1, 2, 68.20);
INSERT INTO sales_parts VALUES (2, 3, 21.30);
INSERT INTO sales_parts VALUES (3, 3, 54.40);
INSERT INTO sales_parts VALUES (4, 1, 35.70);

sales_car and sales_parts hold sales made by customers. sales_carsales_parts保持客户的销售额。 The idea is to write a query that sums the "sale_amount" of both cars and parts for a particular customer and groups the result by id. 我们的想法是编写一个查询,该查询将特定客户的汽车和零件的“sale_amount”相加,并按结果对结果进行分组。

Does someone hast a suggestion how I can go about this problem? 有人有一个建议我怎么能解决这个问题?

You may want to try something like the following: 您可能想尝试以下内容:

SELECT  c.customer_id,
        tot_cars.total + tot_parts.total AS total_sales
FROM    customer c
JOIN    (
           SELECT   customer_id, SUM(sale_amount) total
           FROM     sales_cars
           GROUP BY customer_id
        ) tot_cars ON (tot_cars.customer_id = c.customer_id)
JOIN    (
           SELECT   customer_id, SUM(sale_amount) total
           FROM     sales_parts
           GROUP BY customer_id
        ) tot_parts ON (tot_parts.customer_id = c.customer_id);

Result: 结果:

+-------------+-------------+
| customer_id | total_sales |
+-------------+-------------+
|           1 |       64.00 |
|           2 |      128.20 |
|           3 |       90.10 |
+-------------+-------------+
3 rows in set (0.03 sec)

UPDATE: Further to comments below: 更新:继续下面的评论:

Let's start with the sale_date field: 让我们从sale_date字段开始:

CREATE TABLE sales_cars (
  sale_id mediumint(8) unsigned NOT NULL auto_increment,
  customer_id mediumint(8) unsigned NOT NULL,
  sale_amount decimal(10,2) NOT NULL,
  sale_date datetime NOT NULL,
  PRIMARY KEY (sale_id)
);

INSERT INTO sales_cars VALUES (1, 3, 14.40, '2010-07-01 12:00:00');
INSERT INTO sales_cars VALUES (2, 1, 28.30, '2010-07-05 12:00:00');
INSERT INTO sales_cars VALUES (3, 2, 34.40, '2010-07-10 12:00:00');
INSERT INTO sales_cars VALUES (4, 2, 25.60, '2010-07-20 12:00:00');

To get the date of the latest sale of each customer, you can join the query described previously with another derived table, as follows: 要获取每个客户的最新销售日期,您可以将先前描述的查询与另一个派生表一起加入,如下所示:

SELECT  c.customer_id,
        tot_cars.total + tot_parts.total AS total_sales,
        latest_sales.date AS latest_sale
FROM    customer c
JOIN    (
           SELECT   customer_id, SUM(sale_amount) total
           FROM     sales_cars
           GROUP BY customer_id
        ) tot_cars ON (tot_cars.customer_id = c.customer_id)
JOIN    (
           SELECT   customer_id, SUM(sale_amount) total
           FROM     sales_parts
           GROUP BY customer_id
        ) tot_parts ON (tot_parts.customer_id = c.customer_id)
JOIN    (
           SELECT   customer_id, MAX(sale_date) date
           FROM     sales_cars
           GROUP BY customer_id
        ) latest_sales ON (latest_sales.customer_id = c.customer_id);

Result: 结果:

+-------------+-------------+---------------------+
| customer_id | total_sales | latest_sale         |
+-------------+-------------+---------------------+
|           1 |       64.00 | 2010-07-05 12:00:00 |
|           2 |      128.20 | 2010-07-20 12:00:00 |
|           3 |       90.10 | 2010-07-01 12:00:00 |
+-------------+-------------+---------------------+
3 rows in set (0.07 sec)

Do you see the pattern? 你看到了这种模式吗? There are other approaches to tackle the same problem, but joining with derived tables is a very easy and straightforward technique. 还有其他方法可以解决同样的问题,但加入派生表是一种非常简单直接的技术。

Then regarding the changes in the customer table, I assume you mean something like this: 然后关于customer表中的更改,我假设您的意思是这样的:

CREATE TABLE customer (
  customer_id mediumint(8) unsigned NOT NULL auto_increment,
  first_name varchar(50) NOT NULL,
  last_name varchar(50) NOT NULL,
  gender char(1) NOT NULL,
  PRIMARY KEY (customer_id)
);

INSERT INTO customer VALUES (1, 'Joe', 'Doe', 'M');
INSERT INTO customer VALUES (2, 'Jane', 'Smith', 'F');
INSERT INTO customer VALUES (3, 'Peter', 'Brown', 'M');

To concatenate string fields in MySQL, you can simply use the CONCAT() function: 要在MySQL中连接字符串字段,您只需使用CONCAT()函数:

SELECT CONCAT(c.first_name, ' ', c.last_name) as full_name
FROM   customer c;

Returns: 返回:

+-------------+
| full_name   |
+-------------+
| Jane Smith  |
| Peter Brown |
| Joe Doe     |
+-------------+
3 rows in set (0.01 sec)

To apply the 'Mr' or 'Ms' conditionally, you can then use the CASE statement: 要有条件地应用“先生”或“女士”,您可以使用CASE声明:

SELECT (CASE c.gender WHEN 'M' THEN 'Mr' WHEN 'F' THEN 'Ms' END) salutaiton,
       CONCAT(c.first_name, ' ', c.last_name) as full_name
FROM   customer c;

Returns: 返回:

+------------+-------------+
| salutaiton | full_name   |
+------------+-------------+
| Ms         | Jane Smith  |
| Mr         | Peter Brown |
| Mr         | Joe Doe     |
+------------+-------------+
3 rows in set (0.01 sec)

You can also concatenate the two fields together: 您还可以将两个字段连接在一起:

SELECT CONCAT((CASE c.gender WHEN 'M' THEN 'Mr' WHEN 'F' THEN 'Ms' END), ' ',
               c.first_name, ' ', c.last_name) as full_name
FROM   customer c;

Returns: 返回:

+----------------+
| full_name      |
+----------------+
| Ms Jane Smith  |
| Mr Peter Brown |
| Mr Joe Doe     |
+----------------+
3 rows in set (0.00 sec)

Finally, we can attach this to our main query, as follows: 最后,我们可以将其附加到我们的主查询中,如下所示:

SELECT  c.customer_id,
        CONCAT((CASE c.gender WHEN 'M' THEN 'Mr' WHEN 'F' THEN 'Ms' END), ' ',
                   c.first_name, ' ', c.last_name) as full_name,
        tot_cars.total + tot_parts.total AS total_sales,
        latest_sales.date AS latest_sale
FROM    customer c
JOIN    (
           SELECT   customer_id, SUM(sale_amount) total
           FROM     sales_cars
           GROUP BY customer_id
        ) tot_cars ON (tot_cars.customer_id = c.customer_id)
JOIN    (
           SELECT   customer_id, SUM(sale_amount) total
           FROM     sales_parts
           GROUP BY customer_id
        ) tot_parts ON (tot_parts.customer_id = c.customer_id)
JOIN    (
           SELECT   customer_id, MAX(sale_date) date
           FROM     sales_cars
           GROUP BY customer_id
        ) latest_sales ON (latest_sales.customer_id = c.customer_id);

Returns: 返回:

+-------------+----------------+-------------+---------------------+
| customer_id | full_name      | total_sales | latest_sale         |
+-------------+----------------+-------------+---------------------+
|           1 | Mr Joe Doe     |       64.00 | 2010-07-05 12:00:00 |
|           2 | Ms Jane Smith  |      128.20 | 2010-07-20 12:00:00 |
|           3 | Mr Peter Brown |       90.10 | 2010-07-01 12:00:00 |
+-------------+----------------+-------------+---------------------+
3 rows in set (0.02 sec)

Something like this will be what you are after... 像这样的东西将是你追求的......

SELECT *,
       (SELECT SUM(sale_amount)
            FROM sales_cars
            WHERE sales_cars.customer_id = customer.customer_id) AS car_sales,
       (SELECT SUM(sale_amount)
            FROM sales_parts
            WHERE sales_parts.customer_id = customer.customer_id) AS part_sales
    FROM customer;
  select customer.customer_id,(totalcar + totalparts) as total from customer  
inner join
(select customer_id ,sum(sale_amount) as totalcar 
        from sales_cars group by customer_id) d
on customer_id = d.customer_id
inner join 
(select customer_id , sum(sale_amount) as totalparts  
        from sales_parts group by customer_id) d1

on customer_id = d1. customer_id

i dont think aggregated subqueries is good idea 我不认为聚合子查询是个好主意

select customer_id, sum(sale_amount) from (
select customer.customer_id, sale_amount from customer
join sales_cars on sales_cars.customer_id = customer.customer_id
union all
select customer.customer_id, sale_amount from customer
join sales_parts on sales_parts.customer_id = customer.customer_id
) totals group by customer_id

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM