例如,当我执行INSERT INTO GROUP
时,我可以创建一个“组”,之后INSERT INTO taker_in_group
创建一个新创建的组的ID和其他几个task_taker_ids
想象一下我是id_ 的task_taker,我创建了一个包含typ的新任务,并将其与组1对齐:
我的问题是:我如何获得我创建的所有任务以及某人给我的所有任务? (例如,如果我是另一个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;
问题是,该查询仅将包含在其中的组中的所有任务作为结果。例如,如果我创建一个没有我作为成员的组,创建一个任务,将其指向该组并执行上面的查询,它不会显示我刚刚创建的任务。如何进行查询以显示我创建的所有任务(没有我在创建的组中)以及某人分配给我的任务?而且在几行中没有相同的任务
答案 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")
;
对于您添加到此的每个附加列,您可能会看到行数增加,并且可能会重复某些信息。
注释