[英]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
子句中的子查詢不需要join
回customer
假設id
是customer的適當定義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.