mysql - 我如何获得特定的大查询 sql

标签 mysql join

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

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

taker_in_groupgroup 看起来像这样 enter image description here

假设我是 ID 为 3 的 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;

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

最佳答案

如果一个任务可以有多种类型,那么您将获得每种类型的重复任务。如果有多个组分配给一个任务,那么您将获得每个组的重复任务。如果一个任务有两种多种类型,一个任务有多个组,那么您会得到多行 - 多行。对于您加入的每个表,这种行乘法都会扩展。这是 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? (而只是使用外键列在任务表中键入。)

关于mysql - 我如何获得特定的大查询 sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44102025/

相关文章:

mysql - 获取论坛中所有主题的回复总数

mysql - 将 MySQL NOT EXISTS 转换为 INNER JOIN

php - 如果已分配给 orderno,则选择不显示的查询

php - 显示重复记录

mysql - codeigniter sql表转换

mysql - 当中间有另一个表未使用时,如何连接两个表?

php - MySQL 使用 EXISTS 选择计数

来自 HTML 页面的 PHP post 请求显示空白输入字段

sql - 在具有不同名称的列上连接表但在结果中产生单列

mysql - GROUP_CONCAT 中的双结果与 MySQL 中的双 JOIN