如何通过大查询sql

时间:2017-05-21 21:34:25

标签: mysql join

这是我的关系的简化版本: enter image description here

例如,当我执行INSERT INTO GROUP时,我可以创建一个“组”,之后INSERT INTO taker_in_group创建一个新创建的组的ID和其他几个task_taker_ids

taker_in_groupgroup看起来像这样 enter image description here

想象一下我是id_ 的task_taker,我创建了一个包含typ的新任务,并将其与组1对齐:

enter image description here

我的问题是:我如何获得我创建的所有任务以及某人给我的所有任务? (例如,如果我是另一个ID)

尝试过像这样的查询:

SELECT * 
  FROM task t 
  LEFT 
  JOIN task_in_typ tp 
    ON tp.task_id = t.task_id 
  LEFT 
  JOIN typ ty 
    ON ty.typ_id = tp.typ_id 
  LEFT 
  JOIN assigned_to ag 
    ON ag.task_id = t.task_id 
  LEFT 
  JOIN groupe g 
    ON g.group_id = ag.group_id 
  LEFT 
  JOIN taker_in_group ttg 
    ON ttg.group_id = g.group_id 
  LEFT 
  JOIN task_taker ta 
    ON ta.task_taker_id = ttg.task_taker_id 
 WHERE ta.task_taker_id = 3;

问题是,该查询仅将包含在其中的组中的所有任务作为结果。例如,如果我创建一个没有我作为成员的组,创建一个任务,将其指向该组并执行上面的查询,它不会显示我刚刚创建的任务。如何进行查询以显示我创建的所有任务(没有我在创建的组中)以及某人分配给我的任务?而且在几行中没有相同的任务

1 个答案:

答案 0 :(得分:0)

如果某个任务可以有多种类型,那么您将为每种类型重复执行该任务。如果为任务分配了多个组,则会为每个组重复执行该任务。如果任务中有两个多个类型,而任务有多个组,那么您将获得多行 - 多行。对于您加入的每个表,这些行的乘法会扩展。这是SQL和"期望"的标准行为。

如果你想通过限制列并要求不同来禁止重复信息。

SELECT DISTINCT
      t.task_id, t.title
FROM task t
INNER JOIN task_in_typ tp     ON t.task_id = tp.task_id
INNER JOIN typ ty             ON tp.typ_id = ty.typ_id
INNER JOIN assigned_to ag     ON t.task_id = ag.task_id
INNER JOIN groupe g           ON ag.group_id = g.group_id
INNER JOIN taker_in_group ttg ON g.group_id = ttg.group_id
INNER JOIN task_taker ta      ON ttg.task_taker_id = ta.task_taker_id
WHERE t.task_creator = 'me' -- (i.e. something that evaluates to "me")
OR ta.task_taker_id = 3     -- (assuming 3 equates to "me")
;

对于您添加到此的每个附加列,您可能会看到行数增加,并且可能会重复某些信息。

注释

  1. 如果要通过要求where子句中的某些条件忽略不匹配的行,则使用LEFT JOINS是没有用的。
  2. 如果单个任务永远不会有多个类型,为什么要使用表task_in_typ呢? (而只是使用外键列键入任务表。)