查询MySQL数据库以显示选定的行和所有行

时间:2013-09-17 18:46:48

标签: php mysql

我现在遇到一个问题,我试图获取所有行以及表格中的选定行。

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

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

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

我是否忽略了明显的事情,还是需要更复杂的查询?或者也许是几个问题?

进一步澄清:

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

4 个答案:

答案 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

中没有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();
}

因此,一旦您需要显示可用的受理人,您就可以调用相应的方法,当您需要向当前的受让人展示时也是如此。

答案 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>