0

目前我有一个问题,我试图从我的表中获取所有行以及选定的行。

所以我有三个表 - 用户、任务和一个名为 tasks_users 的连接表

后一个表仅包含两列 - task_id 和 user_id,用于规范化。

我有一个表格来编辑任务。当我想检索所有用户(因此可以重新分配任务)并且我还想显示当前用户时,就会出现问题。鉴于我当前的查询,我只能获取所有用户,或者只是单个相关用户。

我是否忽略了一些明显的问题,还是需要更复杂的查询?或者可能有几个查询?

进一步澄清:

想象一下,您有一个“编辑任务”表单,上面有当前分配的用户。我还想显示所有其他用户,以便我可以重新分配。鉴于我有三个表,我正在努力构建一个返回我想要的查询。目前我只能返回所有用户或单个分配的用户。

4

4 回答 4

2

似乎与当前用户无关,而是与任务受让人有关。无论谁分配任务,他都不应该将其分配给当前的受让人。

如果只能将一个用户分配给特定任务,则可以删除task_users表,因为只需user_id在表中添加列即可tasks完成相同的工作。

假设你有桌子users

id   |   username   |
---------------------
 1   |     A        |
 2   |     B        |
 3   |     C        |
 4   |     X        |
 5   |     Y        |

并在表中tasks

id   |     title    |   user_id   |
-----------------------------------
 1   |      Bla     |      3      |
 2   |      Asd     |    NULL     |  // if this is even possible

如果您想检索可以分配给 task_id = 1 (Bla) 的人员,您可以简单地执行以下操作:

$currentTaskID = 1; // or however you retrieve them, it's just for the explanation purpose
SELECT id, username FROM users WHERE id != (SELECT user_id FROM tasks WHERE id = $currentTaskID);

输出将是:

id   |   username   |
---------------------
 1   |     A        |
 2   |     B        |
 4   |     X        |
 5   |     Y        |

如果一项任务可以分配给多个用户,并且您将保留task_users表格,我们可以想象您有:

task_id   |   user_id   |
-------------------------
   1      |     3       |
   2      |    NULL     |
   1      |     5       |

你可以这样查询:

$currentTaskID = 1; // or however you retrieve them, it's just for the explanation purpose
SELECT id, username FROM users WHERE id NOT IN (SELECT user_id FROM task_users WHERE task_id = $currentTaskID);

所以输出将是:

id   |   username   |
---------------------
 1   |     A        |
 2   |     B        |
 4   |     X        |

如果您在受理人中允许 NULL 值,因此任务没有分配给任何人,则 SELECT 将返回所有用户,因为WHERE id != NULL当您没有 NULL id 时users

为了在某​​处显示当前用户,但无法分配,您应该在函数/方法中分离查询。

说你有:

function getAvailableAssignees($task_id) {
     $sql = "SELECT id, username FROM users WHERE id != (SELECT user_id FROM tasks WHERE id = $task_id);";
     $this->query($sql);
     return $this->result();
}

function getCurrentAssignee($task_id) {
     $sql = "SELECT user_id FROM tasks where id = $task_id;";
     $this->query($sql);
     return $this->result();
}

因此,一旦您需要显示可用的受让人,您就调用相应的方法,当您需要显示当前的受让人时,也可以这样做。

于 2013-09-17T19:11:31.673 回答
0

我想你可能正在寻找一个UNION ALL

SELECT username, status from table
UNION ALL
SELECT username, status from table where status = 'current' LIMIT 1

确保第一个查询的列数与第二个查询的列数相匹配。不要SELECT * FROM在一个查询和SELECT username from另一个查询中进行。

于 2013-09-17T18:57:53.943 回答
0

我认为您应该进行 2 次查询,而不是 1 次。用户表似乎不应该与任务和用户选择处于相同的数据选择中。

如果您坚持合并结果,您可以使用UNION DISTINCT合并 2 个查询的结果。

第一个查询决定要返回的列,因此您应该将其设置为连接表,因为这些是更多列。用户还应该适合加入选择的列,因为它已经包含它们。

于 2013-09-17T19:00:23.787 回答
0

谢谢大家的回复。然而,我设法使用嵌套的 foreach 循环解决了这个问题:

<ul>
<?php foreach($stages as $stage):?>
    <li>
        <label>
            <?php echo $stage['stage_id']; ?> 
            <input type="checkbox" name="stages[]" value="<?php echo $stage['stage_id']; ?>" 
                <?php
                    // loop through the assigned stages. if it matches the stage ID then echo checked 
                    foreach ($assigned_stages as $assigned_stage)
                    { 
                        if ($stage['stage_id'] === $assigned_stage['stage_id'])
                        {
                            echo 'checked';
                        }                                       
                    }
                ?>
            /> 
            <?php echo $stage['name']; ?>
        </label>
    </li>
<?php endforeach; ?>
</ul>

这是一个非常常见的情况,我仍然不确定这是否是最好的方法,但是它可以正常工作并且不涉及大量代码,所以目前我很高兴。

于 2013-09-17T19:39:50.470 回答