2012-01-31 17 views
10

私は3つのテーブルを持っている、私はテーブルのいずれかからすべてのデータを選択し、何回データの特定の行がリンクされている他の2つのテーブル。複数のテーブルから2つのテーブルから複数のCOUNT()をLEFT JOIN

したがって、site_projectsのすべてのデータを選択します。次に、site_project_members WHERE site_projectsのCOUNTを返します。 id = site_project_memberspidまた、site_project_tasks WHERE site_projectsのCOUNTを返します。 id = site_project_memberspid

私は意味があると思いますが、質問には正しいと思われます。それは問題なくデータベース(MySQL)をquerysします。 を除いて、両方のカウントの合計を両方のものとして返します。

id | title  | desc  | start  | deadline | progress 

1 | Project 1 | a project | 1321748906 | 1329847200 | 20 

site_project_membersここ

id | pid | uid | img | hidden 
1 | 1 | 1 | 1 | 0 
2 | 1 | 2 | 2 | 0 

site_project_tasks

id | pid | desc | completed 
1 | 1 | Task 1 | 1 
1 | 1 | Task 2 | 0 

site_projectsは私のクエリです(テーブル構造下記参照) 0

私が得る結果は次のとおりです。助けることができるS誰でも:

id | title  | desc  | progress | start  | deadline | members | tasks 
1 | Project 1 | a project | 20  | 1321748906 | 1329847200 | 4  | 4 

「4」の値の両方は、しかし、彼らはありません2.すべきですか? 感謝

おかげで、 ダン本当にトリックを行う必要があります

+0

これは、あなたが間違って集計しているためです! MySQLは、他のRDBMSとは異なり、このような集約を実行することを止めません。基本的には、 'GROUP BY'を指定していないので、ランダムな値を返します。 – JNK

答えて

21
SELECT p.id , p.title , p.desc , p.progress , p.start , p.deadline , 
    COALESCE(m.cnt, 0) AS members, 
    COALESCE(t.cnt, 0) AS tasks 
FROM site_projects p 
LEFT JOIN 
    (SELECT pid, COUNT(*) AS cnt FROM 
    site_project_members 
    GROUP BY pid) m 
ON p.id = m.pid 
LEFT JOIN 
    (SELECT pid, COUNT(*) AS cnt FROM 
    site_project_tasks 
    GROUP BY pid) t 
ON p.id = t.pid 
ORDER BY p.id ASC 
+0

治療をしてください! :Dありがとうございました:) –

+0

ありがとう、これは私の質問に私を助けました。 COALESCE(comments.total、0)ASコメント、 'user'。*、' company'.name FROM 'user'は、 INNER JOIN 'company' ON user.company_id = company.id INNER JOIN(SELECT user_id、count(*))はフィード 'GROUP BY user_id'から投稿されます。posts.user_id = user.id INNER JOIN(SELECT user_id GROUP BY user_id)コメントON ONユーザーのID: INNER JOIN(SELECT user_id、count(*)はGROUP BY user_idのようなGROUP BYの総数)はlikes.user_idになります= user.id; –

3
SELECT p.`id`, p.`title`, p.`desc`, p.`progress`, p.`start`, p.`deadline`, 
    (SELECT COUNT(*) FROM site_project_members m WHERE p.`id`=m.`pid`) AS `members`, 
    (SELECT COUNT(*) FROM site_project_tasks t WHERE p.`id`=t.`pid`) AS `tasks` 
FROM `site_projects` p 
ORDER BY p.`id` ASC 

+0

答えがありがとうございますが、それでも同じ結果が得られます。S –

+0

うーん、問題は外部結合内にある...再設計する方法を考えさせてください。 – dgw

+0

@DanSpiteri Ok、再設計が完了しました。 – dgw

関連する問題