MySQL LEFT JOIN导致"重复"行

时间:2015-03-03 19:46:52

标签: php mysql left-join inner-join

我有“客户”和“计划”表,我想列出所有客户,无论他们是否有计划。我正在使用查询来执行此操作

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一些如何,但我现在没有得到它...

3 个答案:

答案 0 :(得分:3)

SELECT c.name, 
( SELECT p.goal
  FROM plan p
  WHERE p.customerid=c.customerid
  AND NOT EXISTS (  SELECT 'a'
                    FROM plan p2
                    WHERE p2.customerid = p.customerid
                    AND p2.planid > p.planId
                  )
)
FROM customer c

答案 1 :(得分:1)

我认为这样的事情会奏效:

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

答案 2 :(得分:1)

我认为你应该在计划表中添加一个boolean / tinyint列,表示IsLatest或类似的东西。然后你可以这样做:

SELECT customer.name, plan.goal
FROM customer
LEFT JOIN plan ON plan.customerid=customer.customerid
where testplan.islatest = 1 or testplan.islatest is null
ORDER BY customer.name

另外,我会远离子查询答案,例如

select a from (select b from c where e=f) where g=h

因为除了阅读困惑之外,它们通常表现不佳。