我有“客户”和“计划”表,我想列出所有客户,无论他们是否有计划。我正在使用查询来做到这一点

SELECT customer.name, plan.goal
FROM customer
LEFT JOIN plan ON plan.customerid=customer.customerid
ORDER BY customer.name


我还希望看到带有客户名称的目标(plan.goal)。只要客户没有计划或只有一个计划,此方法就起作用。如果客户有两个或多个计划,那么我得到的客户名称行将与计划一样多。

我想要的是最新计划中的customer.name和plan.goal。我们可以假设plan.planid是最新的计划中较高的值。

我想我应该使用子查询,并以某种方式使用INNER JOINS,但是我现在不明白...

最佳答案

我认为这样的事情会起作用:

SELECT customer.name, plan.goal
FROM customer c
inner join plan p on c.customerId = p.customerId
inner JOIN (
    -- grabs the most recent plan per customer
    select max(planId) as planId, customerId
    from plan
    group by customerId
) maxPlan on p.planId = maxPlan.planId
UNION
-- handles customers w/o a plan
select customer.name, null
from customer c
left join plan p on c.customerId = p.customerId
where p.customerId is null
ORDER BY customer.name

关于php - MySQL LEFT JOIN导致“重复”行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28840647/

10-13 07:08