2017-09-12 6 views
-2

このクエリで2番目の結合に問題があります。ユーザーは、他のユーザーの発注に影響を与えないタスクの順序を変更することができます。しかし、ユーザの作業が彼のために表示されないための第二の参加ので、何のためには、まだ設定されていない場合、それは、外側左されているにもかかわらず結果を返しませんSQLは必要な処理をしません

select `workflow_tasks`.*, 
     `workflow_task_order`.`order`, 
     `workflow_group_tasks`.`group_id` as `pivot_group_id`, 
     `workflow_group_tasks`.`task_id` as `pivot_task_id` 
from `workflow_tasks` 
    inner join `workflow_group_tasks` on `workflow_tasks`.`id` = `workflow_group_tasks`.`task_id` 
    left outer join `workflow_task_order` on `workflow_tasks`.`id` = `workflow_task_order`.`task_id` 
where (`workflow_task_order`.`user_id` = 1 
     or `workflow_task_order`.`user_id` is null) 
and `workflow_group_tasks`.`group_id` in (1, 2, 3, 7) 
group by `workflow_tasks`.`id` 
order by `order` asc 
+2

今日のヒント:テーブルエイリアス! – jarlh

+2

カラム名として 'order'を使用しないでください – Jens

+0

サンプルテーブルのデータと期待される結果を書式付きテキスト(画像ではありません)として追加します。 – jarlh

答えて

0

に参加する私は、あなたがworkflow_task_orderよりも、別のテーブルでユーザフィルタを適用すべきであると仮定特定のユーザーのタスクを取得したいときこれがあなたの唯一のユーザー(私が想定しているもの)であれば、クエリは結果を返しません。これはあなたがまだそのユーザーの "注文"レコードを持っていないと言っていて、あなたは明らかにnullというIDのユーザーのためのエントリを持っていないからです。

私はあなたがあまりにもworkflow_tasksuser_id列を持って、次のクエリは正常に動作し、あなたが期待するものをもたらすはずであると仮定します。

select `workflow_tasks`.*, 
     `workflow_task_order`.`order`, 
     `workflow_group_tasks`.`group_id` as `pivot_group_id`, 
     `workflow_group_tasks`.`task_id` as `pivot_task_id` 
from `workflow_tasks` 
    inner join `workflow_group_tasks` on `workflow_tasks`.`id` = `workflow_group_tasks`.`task_id` 
    left outer join `workflow_task_order` on `workflow_tasks`.`id` = `workflow_task_order`.`task_id` 
where `workflow_tasks`.`user_id` = 1 
and `workflow_group_tasks`.`group_id` in (1, 2, 3, 7) 
group by `workflow_tasks`.`id` 
order by `order` asc 

あなたが別のユーザー(チーム用など)のための一般的なタスクを持っているがあればあなたは、次のクエリは、より適切である必要があり、workflow_task_order以外のテーブルでuser_idを持っていない:

select `workflow_tasks`.*, 
     `workflow_task_order`.`order`, 
     `workflow_group_tasks`.`group_id` as `pivot_group_id`, 
     `workflow_group_tasks`.`task_id` as `pivot_task_id` 
from `workflow_tasks` 
    inner join `workflow_group_tasks` on `workflow_tasks`.`id` = `workflow_group_tasks`.`task_id` 
    left outer join `workflow_task_order` on (`workflow_tasks`.`id` = `workflow_task_order`.`task_id` and `workflow_task_order`.`user_id` = 1) 
where `workflow_group_tasks`.`group_id` in (1, 2, 3, 7) 
group by `workflow_tasks`.`id` 
order by `order` asc 
+0

クエリがlaravelによって生成されるため、エイリアスを使用しません。 申し訳ありませんが、私はここで新しいです。私は次回にデータを追加します。 1.ユーザーがタスクを作成し、このユーザーのレコードが作成されます。 2.タスクを表示する権限を持つ別のユーザーにはタスクリストが表示されますが、注文テーブルにレコードがないため、タスクは表示されません。 –

0

あなたの問題はon句です。しかし、あなたのクエリが以前よりもずっと読みやすい表の別名を持つようになります:のユーザーではなく1用タスクの受注がある場合

select wt.*, wto.`order`, wgt.group_id as pivot_group_id, 
     wgt.task_id as pivot_task_id 
from workflow_tasks wt inner join 
    workflow_group_tasks wgt 
    on wt.id = wgt.task_id left join 
    workflow_task_order wto 
    on wt.id = wto.task_id and wto.user_id = 1 
where wgt.group_id in (1, 2, 3, 7) 
group by wt.id 
order by `order` asc; 

行が本当に一致すると仮定すると、お使いのバージョンでは動作しません。次に、whereはすべての行を除外します。

は、私はいくつか他のものを言及してみましょう:

  • 表の別名が読みクエリがずっと容易になります。
  • group byは、selectに集約機能がないため、疑いがあります。私はあなたが何をしているのか質問します。
  • orderは、SQLキーワードであるため、実際には列の名前が正しくありません。
関連する問題