我现在遇到一个问题,我试图获取所有行以及表格中的选定行。
所以我有三个表 - 用户,任务和一个名为tasks_users的连接表
后一个表只包含两列 - task_id和user_id,用于规范化。
我有一个表单来编辑任务。当我想要检索所有用户时(因此可以重新分配任务)并且我还想显示CURRENT用户时出现问题。鉴于我当前的查询,我只能获得所有用户,或者只能获得单个相关用户。
我是否忽略了明显的事情,还是需要更复杂的查询?或者也许是几个问题?
进一步澄清:
想象一下,你有一个"编辑任务"表单,然后您有当前分配的用户。我还要显示所有其他用户,以便我可以重新分配。鉴于我有三个表,我正在努力构建一个返回我想要的查询。目前我只能返回所有用户或单个指定用户。
答案 0 :(得分: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
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();
}
因此,一旦您需要显示可用的受理人,您就可以调用相应的方法,当您需要向当前的受让人展示时也是如此。
答案 1 :(得分: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
。
答案 2 :(得分:0)
我认为你应该做2个查询,而不是1个。看起来用户表似乎与任务和用户选择的数据选择不同。
如果您坚持合并结果,可以使用UNION DISTINCT
来合并2个查询的结果。
第一个查询决定要返回的列,因此您应将其设置为连接表,因为这些列是更多列。用户也应该适合已加入的选择的列,因为它已经包含它们。
答案 3 :(得分: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>
这是一个非常常见的情况,我仍然不确定这是否是最佳方法,但它没有问题,并且没有涉及大量代码,因此暂时我很高兴。< / p>