2012-03-15 22 views
0

私はレポートと割り当てテーブルのレコードの総数をカウントしようとしているので、メインテーブルグループから情報を取得しています。グループには主キーIDがあり、他のテーブルにはgidとして保存されます。これはクエリです:SQL Joinは1つのレコードしか返しません。

SELECT `group`.`id` AS `gid` 
     , `group`.`name` AS `g_name` 
     , COUNT(`report`.`id`) AS `reports` 
FROM `group` 
     LEFT OUTER JOIN `report` ON `report`.`gid` = `group`.`id` 
     LEFT OUTER JOIN `assignment` ON `assignment`.`gid` = `group`.`id` 
WHERE `group`.`active` = 0 
ORDER BY 
     `group`.`name`; 

私はこの問題を実行するたびに、複数のグループがあっても1つのレコードしか返されません。

ありがとうございます。

+0

どのRDBMSですか?これはSQL Serverでも解析されません。 – Yuck

+2

downvoteするつもりはありませんが、テーブル "group"の名前を付けるために-5を与えたいと思います。少なくとも括弧で囲んでください...してください。 –

+0

それはmysqlなので、誰かがそれを編集したばかりでないからです。 – Parham

答えて

3

まあ、あなたのクエリは正しいからです:)まず、group by句のない集計関数(この場合はcount)を使用するべきではありません。さて、あなたはその句を持っている場合でも、クエリは情報を要約し、同じクエリの詳細と要約の両方を求めます。この情報を取得するには2つの個別のクエリをお勧めしますが、1つのクエリ(詳細とレポートおよび割り当てテーブルのレコードの総数)にのみ情報が混在するようにしたい場合は、次のクエリを実行してください:

私はあなたが探しているものを正確に理解することができましたが、これはあなたが期待する結果を得る方法についてのアイデアを与えるかもしれません。

+0

ありがとうございます!アドバイスありがとう – Parham

+0

グループから提出されたレポートの総数と、管理者によって割り当てられた割り当ての総数を取得しようとしていました。グループがまだ一緒に働いているなら、アクティブな手段 – Parham

0

1つのレコードを返すことに制限される何も明白なクエリを見ることはできません。

あなたは、問題が既存のデータとどこにあるかを確認するために、それを分割する必要があります。

は、どのように多くのグループ0 =どこacitive、対応する割り当てレコードを持つ多くのahowなど

0

多分それは役立ちます:LEFTので、もし私が

SELECT 
    groupid, 
    groupname, 
    reports, 
    assignments, 
FROM 
(SELECT group.id, group.name, COUNT(*) AS reports from group 
    INNER JOIN report ON (report.gid = group.id) 
    WHERE group.active = 0 
    GROUP BY group.id) AS ReportForGroup 
CROSS JOIN 
(SELECT group.id AS groupid, group.name AS groupname, COUNT(*) AS assignments from group 
    INNER JOIN assignmentON (assignment.gid = group.id) 
    WHERE group.active = 0 
    GROUP BY group.id) AS AssignmentForGroup 
    ON (ReportForGroup.groupid = AssignmentForGroup.groupid) 
ORDER BY groupname; 

を、それをチェックすることはできませんJOINはCOUNT(*)0または1に戻ります。0を返す場合はINNERをLEFTに変更し、2つのクエリ間でINNER JOINを使用します。

関連する問題