2013-07-04 60 views
0

表 “规划”凡亚子查询的MySQL

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'在每个数组中。我发现了许多类似的解决方案,但我无法修复它。

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

+0

plan.id其实并不存在,你调用它,因为它会如果你使用的是连接(我不能告诉是否有可能在您的情况) –

+0

@Bartdude是现在我知道它不存在。但一切都是可能的,所以我期望这有一个解决方案 – mesnicka

回答

2

试试这个

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)) 
    
+0

你的解决方案是绝对完美的。但这只是我复杂的查询的一部分(子查询),并且我有一个关于子查询的错误正在返回多于一行:( – mesnicka

+0

@mesnicka欢迎:),很高兴你得到了你想要的。祝你好运! :) –

+0

是啊!现在我的任务完全结束了。谢谢你。我的周末会更长。我欠你一杯啤酒,男人:) – mesnicka

0

使用联接: -

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