我有“客户”和“计划”表,我想列出所有客户,无论他们是否有计划。我正在使用查询来执行此操作
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一些如何,但我现在没有得到它...
答案 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
因为除了阅读困惑之外,它们通常表现不佳。