【问题标题】:WHERE in sub subselect MySQL在子选择 MySQL 中的 WHERE
【发布时间】:2013-07-04 11:40:51
【问题描述】:

表“计划”

id   name
1     abc
2     def
3     ghi

表“时间表”

id     fk_store     fk_plan
1         4            1
2         4            1
3         4            1
4         6            1
5         6            1
6         5            3
7         7            3
8         7            3
9         12           1

这是我的查询:

SELECT plan.id as id, name, 
(SELECT GROUP_CONCAT(cnt) cnt FROM (SELECT COUNT(*) cnt 
FROM schedule WHERE fk_plan = plan.id GROUP BY fk_store) q) as schedule_count  
FROM plan LEFT JOIN schedule ON plan.id = schedule.fk_plan GROUP BY plan.id

我期待这个结果(例如在数组中):

 [0] = array(
    ['id'] = 1,
    ['name'] = 'abc',
    ['schedule_count'] = '3, 2, 1'
 ),

 [1] = array(
    ['id'] = 2,
    ['name'] = 'def',     
    ['schedule_count'] = ''
),

 [2] = array(
    ['id'] = 3,
    ['name'] = 'ghi',     
    ['schedule_count'] = '2,1'
),

不幸的是,我收到一个错误,即 WHERE 子句中的 plan.id 列未定义。当我不使用 WHERE 时,每个数组中的结果 'schedule_count' 是 '3, 2, 2, 1, 1'。我找到了许多类似的解决方案,但我无法修复它。

我希望我的问题很清楚。提前谢谢你。

【问题讨论】:

  • plan.id 实际上在你调用它的地方并不存在,就像你使用连接时那样(我不知道在你的情况下是否可行)
  • @Bartdude 是的,现在我知道它不存在。但一切皆有可能,所以我希望这有一个解决方案

标签: mysql subquery where-clause


【解决方案1】:

试试这个

    SELECT  plan.id, name ,  GROUP_CONCAT(cnt)  AS schedule_count
    FROM plan left join (select fk_plan, count(fk_store) as cnt from schedule 
                         GROUP BY fk_store)t
              ON t.fk_plan  = plan.id                                 
    GROUP BY plan.id  

DEMO IN FIDDLE

  • 如果您显示 0 而不是 (null),则将上面的 GROUP_CONCAT 替换为此

    GROUP_CONCAT(if(cnt is null , 0 , cnt))
    

【讨论】:

  • 您的解决方案绝对完美。但这只是我的复杂查询的一部分(子查询),我有一个关于子查询返回多于 1 行的错误:(
  • @mesnicka 你欢迎 :) ,很高兴你得到你想要的。祝你好运! :)
  • 是的!现在我的任务已经完成了。谢谢你。我的周末会更长。我欠你一杯啤酒,伙计:)
【解决方案2】:

使用连接:-

SELECT plan.id as id, name, GROUP_CONCAT(PlanCnt)
FROM plan
LEFT OUTER JOIN (SELECT fk_plan, COUNT(DISTINCT fk_store) AS PlanCnt FROM schedule GROUP BY fk_plan) Sub1
ON plan.id = Sub1.fk_plan
GROUP BY plan.id as id, plan.name

【讨论】:

    猜你喜欢
    • 2013-09-04
    • 2015-10-26
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多