2017-08-16 32 views
0

このmysqlクエリを動作させようとしています。MySQL Left Join Countアクティビティとnullを返す

説明:2つのテーブルがあり、1つはすべてのIDの列を持つプロジェクトで、もう1つはプロジェクトのテーブルに関連するprojectidという列を持つすべてのアクティビティです。私は、ユーザーIDを持ち、1でアクティブなアクティビティテーブル内のすべてのアクティビティを数えたいと思っています。 ここではトリッキーな部分が来て、私は働くことができません。それは私がBO内で一意PROJECTIDに対応するすべてのプロジェクトを表示したいと思い活動テーブルに欠けているプロジェクトを収集し、カウント0でこれらを提示していない

SELECT p1.`id` AS projectid ,count(a1.`id`) AS activitiescount ,a1.`userid` AS userid ,p1.`orgid` AS orgid 
FROM `projects` AS p1 
LEFT JOIN `activities` AS a1 
ON p1.`id`=a1.`projectid` 
WHERE p1.`orgid`=3 
AND a1.`userid` = 26 
AND a1.`active`=1 
OR a1.`id` IS null 
GROUP BY p1.`id` 
ORDER BY p1.`name` DESC 

与える:

enter image description here

ご覧のとおり、たとえば6と2では正しくありません。 助けてください。ありがとうございました。

+1

アクティビティの制限を結合自体に移動します。それ以外の場合、左結合は内部結合のように動作します。ユーザID26でなくアクティブ1でないため、ヌルは削除されます。 – xQbert

答えて

0

未テスト:

アクティビティの制限を移動に移動しました。

また、あなたが望む以上にORを戻し、その問題を回避するためにwhere句を移動することで解決する必要があります。

標準的なアプローチ:(W/

SELECT p1.`id` AS projectid 
    , count(a1.`id`) AS activitiescount 
    , a1.`userid` AS userid 
    , p1.`orgid` AS orgid 
FROM `projects` AS p1 
LEFT JOIN `activities` AS a1 
    ON p1.`id`=a1.`projectid` 
AND a1.`userid` = 26 
AND a1.`active`=1 
WHERE p1.`orgid`=3 
GROUP BY p1.`id` 
ORDER BY p1.`name` DESC 

あなたのアプローチ)の正しく配置。

SELECT 
    p1.`id` AS projectid 
    ,count(a1.`id`) AS activitiescount 
    ,a1.`userid` AS userid 
    ,p1.`orgid` AS orgid 

FROM `projects` AS p1 
LEFT JOIN `activities` AS a1 ON p1.`id`=a1.`projectid` 

WHERE p1.`orgid`=3 
    AND ((a1.`userid` = 26 AND a1.`active`=1) OR a1.`id` IS null) 
GROUP BY p1.`id` 
ORDER BY p1.`name` DESC 

----更新コメントごとに外部結合の完全シミュレートします。

SELECT * 
FROM (
SELECT p1.`id` AS projectid 
    , count(a1.`id`) AS activitiescount 
    , a1.`userid` AS userid 
    , p1.`orgid` AS orgid 
FROM `projects` AS p1 
LEFT JOIN `activities` AS a1 
    ON p1.`id`=a1.`projectid` 
AND a1.`userid` = 26 
AND a1.`active`=1 
WHERE p1.`orgid`=3 
GROUP BY p1.`id` 
UNION 
SELECT p1.`id` AS projectid 
    , count(a1.`id`) AS activitiescount 
    , a1.`userid` AS userid 
    , p1.`orgid` AS orgid 
FROM `projects` AS p1 
RIGHT JOIN `activities` AS a1 
    ON p1.`id`=a1.`projectid` 
AND p1.`orgid`=3 
WHERE a1.`userid` = 26 
AND a1.`active`=1 
GROUP BY p1.`id`) 
ORDER BY p1.`id`,A1.ID -- assumes A1.ID exists and you want to order in that fashion. 
+0

驚くべきことです!どうもありがとう、私はこれで苦労してきました。今、私は何か新しいことを学び、これを将来どのように達成するかを学びました。ありがとう! – Amc

+0

外部結合を使用する場合、一般的に言えば、すべてのレコードを示す表に限度を適用するだけです。左側の結合の右側のテーブルの制限は結合に置く必要があります。または、結合は内側の結合のように動作します。 OR句はここではw/o()の問題の大部分を引き起こしていました。 – xQbert

+0

プロジェクト内にnullまたは含まれていないアクティビティ表内のアクティビティも含めることはできますか? – Amc