-1

我需要写一个查询来找到购买了至少 1 个产品的最年轻的客户

这是数据: 客户:

在此处输入图像描述

订单详情:

在此处输入图像描述

到目前为止,这是我的查询:

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 ;

但是,上面的查询给了我在此处输入图像描述

但我需要年龄最小的客户名单。

4

2 回答 2

0

如果您真的只想要一个最年轻的客户,即使有领带,请使用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);

演示

于 2019-05-05T03:45:17.597 回答
0

您只需要来自 的列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;

特别是,这不需要重复消除或聚合,因此它应该更快。它可以使用索引 onface_book_details(customerid)也可能 on customers(age, customerid)

于 2019-05-05T12:14:01.470 回答