2013-03-26 54 views
0

我在我的数据库中的两个表选择合适的数据为用户

enter image description here

U_ID表的任务是从表的用户ID的外键

我的代码是这样的

<?php 
    require("common.php"); 
    if(empty($_SESSION['user'])) 
    { 
     header("Location: login.php"); 
     die("Redirecting to login.php"); 
    } 
    $query = " 
     SELECT 
      id, 
      username, 
      eID 
     FROM users 
     WHERE id <> '5' 
    "; 
    $query1 = " 
     SELECT 
      T_ID, 
      task_tom, 
      U_ID 
     FROM tasks 
     ORDER BY T_ID DESC LIMIT 1 

    "; 
    try 
    { 
     $stmt = $db->prepare($query); 
     $stmt->execute(); 
    } 
    catch(PDOException $ex) 
    { 
     die("Failed to run query: " . $ex->getMessage()); 
    } 
    $rows = $stmt->fetchAll(); 

     try 
    { 
     $stmt1 = $db->prepare($query1); 
     $stmt1->execute(); 
    } 
    catch(PDOException $ex) 
    { 
     die("Failed to run query: " . $ex->getMessage()); 
    } 
    $rows1 = $stmt1->fetchAll(); 
?> 
<h1>Memberlist</h1> 
<table border="1"> 
    <tr> 
     <th>Username</th> 
     <th>Employee ID</th> 
     <th>Task</th> 
    </tr> 
    <?php foreach($rows as $row): foreach($rows1 as $row1): ?> 
     <tr> 
      <td><?php echo htmlentities($row['username'], ENT_QUOTES, 'UTF-8'); ?></td> 
      <td><?php echo htmlentities($row['eID'], ENT_QUOTES, 'UTF-8'); ?></td> 
      <td><?php echo $row1['task_tom']; ?></td> 
      <?php endforeach; endforeach;?> 
</table> 
<br/> 
<a href="edit_account.php">Edit Account</a><br /><a href="logout.php">Logout</a> 

我的问题是我如何填充表中的任务列,对应于正确的U_ID。
这个代码将提供给我这个答案

enter image description here

据称,SSIS(数据挖掘)仅仅是分配给巴希尔和劳伦斯应该有一个空白的任务,因为用户didnt输入劳伦斯任何任务,只是还没有在task_tom但似乎我对我的选择语句有缺陷,或者它是我的每个用户将它打印在桌面上的每个用户。所以我的问题是如何解决这种问题?

+0

不要使用两个查询..而是加入他们与用户ID – 2013-03-26 07:03:42

+0

请你可以请进一步向我解释我的好先生 – Yinks 2013-03-26 07:05:05

+0

好吧看到你的任务每个任务有其各自的用户ID。你可以连接你的任务表u_id到用户表ID来产生只有1个结果,这是你输出的样子看起来像 – 2013-03-26 07:06:52

回答

1
SELECT 
    U.id, 
    U.username, 
    U.eID, 
    t.task_tom 

FROM 
    users u 

    INNER JOIN 
    (
     SELECT u_id, max(t_id) as t_id 
     FROM tasks 
     GROUP BY u_id 
    ) tmax 
    ON tmax.U_ID = u.id 

    INNER JOIN tasks t ON t.t_id = tmax.t_id 

WHERE u.id <> '5' 

工作这基本上说,“什么是对每个用户的最新任务ID,现在让我关于该任务的所有信息“。

+0

“字段列表”中的未知列'id' – Yinks 2013-03-26 07:40:51

+0

@Yinks抱歉,输入时看不到您的表格。现在就试试。 – Sepster 2013-03-26 07:43:47

+0

这个工作,但它不会显示任何其他成员,除非他们有一个任务分配给他们。即使没有分配任务,是否有任何方法可以抓取他们的名字? – Yinks 2013-03-26 07:46:39

0

JOIN您的表格使用LEFT JOINRIGHT JOININNER JOIN根据您的要求。

SELECT 
     id, 
     username, 
     eID, 
     T_ID, 
     task_tom, 
     U_ID 
    FROM users 
    LEFT JOIN tasks ON tasks.U_ID = users.id 
    WHERE users.id <> '5' 
    ORDER BY tasks.T_ID DESC 
    GROUP BY users.id 

编辑答案,但我不知道的

ORDER BY tasks.T_ID DESC 
GROUP BY users.id 
+0

你能告诉我如何做这种提前类型的语句 – Yinks 2013-03-26 07:06:40

+0

执行此查询相同的方式,你在做什么之前,这会给你加入表结果。 – 2013-03-26 07:08:33

+0

好的谢谢你,但现在我怎么可以有每个用户1的限制? – Yinks 2013-03-26 07:09:36

0
$query="SELECT U.id,T.T_ID,task_tom FROM users U LEFT JOIN tasks T ON U.id = T.T_ID WHERE id <> '5' ORDER BY T.T_ID DESC group by U.id";