我需要写一个查询来找到购买至少1种产品的最小客户
以下是数据: 客户:
ORDER_DETAIL:
这是我到目前为止的查询:
SELECT c.CUSTOMERID, c.age, c.name
from (
SELECT CUSTOMERID, COUNT(ORDERID) as "totalOrder"
FROM FACEBOOK_ORDER_DETAIL
GROUP BY CUSTOMERID
HAVING COUNT(ORDERID) >=1) AS tbl
LEFT JOIN FACEBOOK_CUSTOMER c on c.CUSTOMERID = tbl.CUSTOMERID
order by c.age ;
但是我需要年龄最小的客户列表。
答案 0 :(得分:1)
如果您真的只想要一个最小的客户,即使有关系,也可以使用LIMIT
:
SELECT c.CUSTOMERID, c.age, c.name
FROM CUSTOMER c
INNER JOIN FACEBOOK_ORDER_DETAIL o
ON c.CUSTOMERID = c.CUSTOMERID
ORDER BY
c.age
LIMIT 1;
这应该起作用,因为如果客户加入订单明细表,则表明他至少有一个订单。
如果您想查找所有个最年轻的客户,包括所有关系,那么一种很好的解决方法是使用RANK
分析函数:
SELECT DISTINCT CUSTOMERID, age, name
FROM
(
SELECT c.CUSTOMERID, c.age, c.name, RANK() OVER (ORDER BY c.age) rnk
FROM CUSTOMER c
INNER JOIN FACEBOOK_ORDER_DETAIL o
ON c.CUSTOMERID = o.CUSTOMERID
) t
WHERE rnk = 1;
对于早期版本的MySQL,我们可以使用子查询作为一种解决方法来避免出现RANK
:
SELECT DISTINCT c.CUSTOMERID, c.age, c.name
FROM CUSTOMER c
INNER JOIN FACEBOOK_ORDER_DETAIL o
ON c.CUSTOMERID = c.CUSTOMERID
WHERE c.age = (SELECT MIN(t1.age)
FROM CUSTOMER t1
INNER JOIN FACEBOOK_ORDER_DETAIL t2
ON t1.CUSTOMERID = t2.CUSTOMERID);
答案 1 :(得分:1)
您只需要customers
中的列,因此我将其表达为:
select c.*
from (select c.*,
rank() over (order by age) as seqnum
from customers c
where exists (select 1
from facebook_order_detail fod
where fod.customerid = c.customerid
)
) c
where seqnum = 1;
尤其是,这不需要重复的消除或聚合,因此它应该更快。而且它可以在face_book_details(customerid)
上使用索引,也可以在customers(age, customerid)
上使用索引。