簡體   English   中英

MySQL-在另一個子查詢中使用子查詢結果

[英]MySQL - Use subquery result in another subquery

我正在使用以下表格進行查詢:

顧客

id  | name   | lastname
---------------------------------
 1  | john   | text
 2  | rock   | text
 3  | jane   | text
 4  | jack   | text

訂購_

id_order | customer_id | ...
---------------------------------
 1       |      1      | ...
 2       |      2      | ...
 3       |      3      | ...
 4       |      1      | ...
 5       |      2      | ...

我想實現一個查詢,以顯示具有最大訂單數的客戶的名字和姓氏。 如果兩個或兩個以上的客戶具有相同的最大訂單數,我想顯示出來。

到目前為止,我已經完成了以下子查詢:

SELECT name, lastname FROM customer
WHERE customer.id IN 
(SELECT * FROM (SELECT order_.customer_id FROM order_
                INNER JOIN customer
                WHERE order_.customer_id = customer.id
                GROUP BY order_.customer_id
                ) temp
)

我想我必須使用最后一個子查詢的MAX函數來獲取結果,我只是不知道該怎么做。 有任何想法嗎?

你可以做 :

SELECT c.name, c.lastname, count(o.id_order) 
FROM order_ o INNER JOIN 
     customer c
     on o.customer_id = c.id
GROUP BY c.name, c.lastname
ORDER BY count(o.id_order) DESC
LIMIT 1;
DROP TABLE customers;

CREATE TABLE customers
(customer_id  SERIAL PRIMARY KEY
,name VARCHAR(12) NOT NULL
,lastname VARCHAR(12) NOT NULL
);

INSERT INTO customers VALUES
(1,'john','text'),
(2,'rock','text'),
(3,'jane','text');

DROP TABLE orders;

CREATE TABLE orders
(order_id SERIAL PRIMARY KEY
,customer_id INT NOT NULL
);

INSERT INTO orders VALUES
(1,1),
(2,2),
(3,3);


SELECT a.*
  FROM 
     ( SELECT c.*
            , COUNT(*) total 
         FROM customers c
         JOIN orders o
           ON o.customer_id = c.customer_id
        GROUP 
           BY customer_id
    ) a
 JOIN   
    ( SELECT MAX(x.total) max_total
        FROM 
           ( SELECT customer_id
                  , COUNT(*) total 
               FROM orders 
              GROUP 
                 BY customer_id
           ) x
   ) b
  ON b.max_total = a.total;

+-------------+------+----------+-------+
| customer_id | name | lastname | total |
+-------------+------+----------+-------+
|           1 | john | text     |     1 |
|           2 | rock | text     |     1 |
|           3 | jane | text     |     1 |
+-------------+------+----------+-------+
select c.id as 'id',c.name as 'name',c.lastname as 'lastname',count(o.id_order) as 'total_orders'
 from customer c
 inner join order_ o
 ON c.id = o.customer_id
 group by c.id
 having total_orders = (select max(orders)
 from (select count(o1.id_order) as 'orders'
       from customer c1
       inner join order_ o1
        ON c1.id = o1.customer_id
        group by c1.id) derived)

這更復雜,因為您想要重復。 假設customer_id定義的是客戶而不是名稱,則可以執行以下操作:

select c.id, c.name, c.lastname
from customer c join
     order_ o
     on o.customer_id = c.id
group by c.id, c.name, c.lastname
having count(*) = (select count(*)
                   from order_ o2
                   group by o2.customer_id
                   order by count(*) desc
                   limit 1
                  );

請注意, having子句中的子查詢不需要joincustomer假設id是customer的適當定義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM