2013-07-04 100 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