Mysql查询subselect为NULL

时间:2016-10-28 13:28:13

标签: mysql

我正在尝试加入三个表并获得供应商的主动计划。有可能,供应商过去有很多计划,但积极参与是重要的。 整个查询更大(计算他有aso的项目),因为我用subselect做了它,但是对于这个例子它应该足够了。

我总是得到植物和planstatus的NULL。我该如何解决这个问题?

查询

SELECT v.title
     , plans.title AS plantitle
     , uplans.status AS planstatus
     , uplans.uid
     , COUNT(DISTINCT obs.id) AS obj_count
     , sum(case when obs.published = -1 then 1 else 0 end) trash
     , sum(case when obs.published = 1 then 1 else 0 end) published
     , sum(case when obs.published = 0 then 1 else 0 end) unpublished
FROM `vendors` AS v    
LEFT JOIN objects AS obs ON obs.vid = v.id
LEFT JOIN `userplans` AS uplans ON uplans.uid = (
  SELECT up.id
  FROM `userplans`AS up
  WHERE up.uid=v.uid AND status = "ACTIVE" LIMIT 1) 
LEFT JOIN `plans` AS plans ON plans.id=uplans.pid
GROUP BY v.id
ORDER BY v.id asc

Vendors
id, uid, title
10,  1, Name 1
20,  4, Name 2
30,  5, Name 3

Plans
id, title
40, Plan 1
50, Plan 2

Userplans
id, uid, pid, status
1, 1, 40, CANCELED
2, 1, 50, CANCELED
3, 1, 40, CANCELED
4, 4, 50, CANCELED
5, 4, 50, CANCELED
6, 4, 50, ACTIVE 
7, 1, 40, ACTIVE

3 个答案:

答案 0 :(得分:1)

让对象计数为1,因为与其他表的关联可能是1-M,这将导致更大的计数。然后加入其他所需的信息。

这仍然假设userPlan中用户和计划的组合只能有1个活动记录。如果它可以超过1,我仍然需要知道选择哪个活动用户计划。

为什么左边加入?不管计划和对象以及用户计划如何,你都追求所有供应商吗?是否有可能供应商没有活动计划,在这种情况下标题将为空?

SELECT v.title
     , P.title AS plantitle
     , UP.status AS planstatus
     , up.uid
     , O.obj_count
     , O.trash
     , O.published
     , O.unpublished
FROM vendors v    
LEFT JOIN userplans  UP
  ON V.uid = UP.UID
 AND UP.status = 'ACTIVE'
LEFT JOIN (SELECT obs.VID
            ,COUNT(DISTINCT obs.id) AS obj_count
            ,sum(case when obs.published = -1 then 1 else 0 end) trash
            ,sum(case when obs.published = 1 then 1 else 0 end) published
            ,sum(case when obs.published = 0 then 1 else 0 end) unpublished
            FROM OBJECTS obs
            GROUP BY obs.VID) O  
  ON O.vid = v.id
LEFT JOIN `plans` P 
  ON P.id=UP.pid

ORDER BY v.id asc

并且无论状态如何,都要发表评论以获取“最新”计划(假设最新的将在userPlans表中具有最高ID。

SELECT v.title
     , P.title AS plantitle
     , UP.status AS planstatus
     , up.uid
     , O.obj_count
     , O.trash
     , O.published
     , O.unpublished
FROM vendors v    
LEFT JOIN  (SELECT * -- though really we should just pull in the columns needed. 
            FROM USERPLANS U1 
            INNER JOIN (SELECT max(ID) ID, PID, UID 
                        FROM UserPlans 
                        GROUP BY PID, UID) U2 
              on  U1.ID = U2.ID) UP
  ON V.uid = UP.UID
LEFT JOIN (SELECT obs.VID
            ,COUNT(DISTINCT obs.id) AS obj_count
            ,sum(case when obs.published = -1 then 1 else 0 end) trash
            ,sum(case when obs.published = 1 then 1 else 0 end) published
            ,sum(case when obs.published = 0 then 1 else 0 end) unpublished
            FROM OBJECTS obs
            GROUP BY obs.VID) O  
  ON O.vid = v.id
LEFT JOIN `plans` P 
  ON P.id=UP.pid

ORDER BY v.id asc

答案 1 :(得分:0)

在您的用户计划联接中 - 您将使用同一个表中的所选ID加入uplans.uid - 您需要加入同一列 - 将该行更改为:

LEFT JOIN `userplans` AS uplans ON uplans.id = (

答案 2 :(得分:0)

这样的事可能有用:

SELECT Vendors.title, Plans.title, Userplans.status, Userplans.uid FROM Vendors, Plans, Userplans
WHERE Vendors.uid = Userplans.uid AND Plans.id = Userplans.pid AND Userplans.status = 'Active'

这假设您每个用户只能有一个活动