根据第三个表行显示来自两个组合表的数据

时间:2013-11-02 20:31:10

标签: php mysql sql join html-table

我是PHP和MYSQL的新手。我知道我应该使用MYSQLI,但在这种情况下我没有这个选项,所以请耐心等待我!

我的MYSQL数据库中有三个表,如下所示:

表A 用户ID |主题|日期|评价

表B 用户ID |用户名|用户电子邮件

表C 主题|描述

然后我的PHP页面上有一个表格,显示TableA中的信息,每行都有一个“详细信息”按钮。

我想要做的是,如果单击“详细信息”按钮,则表B&的组合信息。根据该行中的主题显示C.

例如。下图显示了页面上的表格,如果单击主题2行中的按钮,则会显示第二个表格,其中包含选择topic2的所有用户的列表。

|主题|用户ID |日期|详细信息|

| 2 | 01 | 11-11-2012 | 按钮 |

| 3 | 02 | 12-11-2012 | 按钮 |

| 2 | 03 | 11-01-2012 | 按钮 |

| 5 | 04 | 11-08-2012 | 按钮 |

单击第一行中的按钮时:

|用户ID |用户名| Useremail |主题|

| 01 | name01 | usermail 1 | 主题说明 |

| 03 | name03 | usermail 3 | 主题说明 |

我对第一个表格的编码如下:

    $query = mysql_query("SELECT * FROM course ORDER BY cname") or die ("error");

    echo '</br><h4 align="center"> Listing </h4></br>';     
    echo'<form action="'.$_SERVER['PHP_SELF'].'" method="POST">
<table border="1" width="50%" align="center"> 
<tr>
    <td>
        <h4>Topic</h4>
    </td>
    <td>
        <h4>UserID</h4>
    </td>
    <td>
        <h4>Details</h4>
    </td>
    </tr>';
        while ($row=mysql_fetch_array($query))
            {
            echo'<tr>
        <td>
                       '.$row['topic'].'
        </td>
        <td>
        <form action="'.$_SERVER['PHP_SELF'].'" method="post">
                     '.$row['Description'].'  
                    </td> 
                    <td>    
                    <align="center">
                    <input type="submit" name="list"  value=" button" />
        </form>
        </td>
        </tr>';
    }

拜托,有人可以帮助我接下来要做什么吗?

我知道我应该使用连接,但不确定是哪一个或如何。 按钮必须以某种方式知道它们在哪一行,以便知道必须显示哪些主题信息,但我不知道如何实现它。

1 个答案:

答案 0 :(得分:0)

对不起,但我不能完全理解你在问什么,也不知道这些表是如何彼此特别相关的。我假设表B是用户数据库表,表A就像一个主题数据库表,我也假设TAble C是对表A的评论。这种关系是否正确? (我将编辑这篇文章,因为我会更清楚地了解到底发生了什么)。

编辑1:这就是你在谈论的吗?正如我已经评论过的那样,我不明白第三个表的用法是什么?

$sql = "SELECT * FROM table_a WHERE Topic=10";
$ans = mysql_query($sql) or die(mysql_error())

while($result = mysql_fetch_assoc($ans)){

}

mysql_free_result($ans)

编辑2:为了加快这种交流速度,我将简要介绍一下我对连接表的了解。

有多种方法可以从多个表中选择数据,并且您使用哪种方法最适合您的目的。

假设我们有以下表格设置:

Users : user_id, username, user_email
Topics: topic_id, user_id, topic_title, topic_text
Posts: post_id, topic_id, user_id, post_text

这是PhpBB的设置,我经常处理。第一个表很简单,它是用户信息表,存储有关用户的所有信息。第二个是发布的主题列表,仅列出标题的基本信息以及发布的标题。第三个,也是重要的一个,是除了原始主题之外的所有主题的帖子。例如。标题为“谁将在战斗中胜出......”的主题与“超人或蝙蝠侠”的文字只会在topic_title中的“谁将在战斗中胜出......”和topic_text中的“超人或蝙蝠侠”中,而对“蝙蝠侠”这个主题的第一个评论将在帖子表中。

现在,假设我在我的论坛板上,所以我想看到所有主题,以决定我应该发布的位置。这是通过

完成的
$sql = "SELECT t.*,u.username FROM topics t, users u WHERE u.user_id=t.user_id";
$ans = mysql_query($sql);

while($result = mysql_fetch_assoc($ans)){
     echo $result['topic_title'].' | '.$result['username'].'<br />';
}

这是连接表的最基本版本。它表示我将从主题和用户的用户名中选择所有内容,其中users表上的user_id列与主题表中的user_id列相同。还有另一种方法可以写这个,但现在让我们专注于基础知识。

这会给你这样的结果

Who would win in a fight... | Bob123
If you could go anywhere in the world | Jose567
Where is the most awkward place you've ever sneezed | Sneezerella

我没有将代码放入以使标题可点击,但假设您了解HTML,这应该不难。所以现在假设我们点击了其中一个链接,它应该看起来类似于

<a href="viewtopic.php?t=1">Who would win in a fight...</a>

所以,我们现在在viewtopic.php上,传递一个参数,t。然后我们会采取这样的方式:

//Assuming connections somewhere up here

$sql = "SELECT t.*,u.username FROM topics t, users u WHERE u.user_id=t.topic_id AND t.topic_id=".$_GET['t']; //This should look familiar, also remember to sanitize your MySQL data, don't just tack it on straight from the $_GET variable like I did. I'm typing this while dealing with my 8 month old
$ans = mysql_query($sql) or die(mysql_error());
$first_post = mysql_fetch_assoc($ans);
echo first_post['topic_title'].'-'.$first_post['username'].'<br /> '.$first_post['topic_text'].' <hr />';
//Outputs something like "Who would win in a fight... - Bob123 <br /> Superman or Batman?
mysql_free_result($ans);
//Gotten the first post and everything else, now to see the comments.

$sql = "SELECT p.*,u.username FROM posts p, users u WHERE u.user_id=p.user_id AND p.topic_id = ".$_GET['t'];
$ans = mysql_query($sql) or die(mysql_error())
while($result = mysql_fetch_assoc($ans)){

   echo $result['username'].' <br />'.$result['post_text'].'<hr />';

}
//This will output something like Sneezerella <br /> Batman <hr /> Bob123 <br /> Superman <hr /> ....[etc]....

mysql_free_result($ans)

还有一段时间你必须使用LEFT JOIN,RIGHT JOIN和/或INNER JOIN语句。根据我的解释,这里有差异

  1. 内部连接 ​​- 这是编写SELECT t。*,u.username FROM主题t,用户u WHERE t.user_id = u.user_id的另一种方法。这里的语法是SELECT t。*,u.usernmae FROM topics t INNER JOIN users u ON u.user_id = t.topic_id。此方法在添加的表中查找1行,在这种情况下为“users”。如果找不到相应的行,则返回空值。 I.E.如果我在主题帖子上有user_id = 1,而user_id实际上是2,则不会返回任何内容。
  2. 左连接 - 将右表中的数据添加到从左侧选择的数据上。 This Article on W3Schools给出了快速细分。基本上它总是会从原始表中进行选择,并且对于任何其他结果将返回NULL。语法与INNER JOIN相同,只需将INNER替换为LEFT即可。所以我们得到SELECT t。* FROM topics t LEFT JOIN users u ON u.user_id = t.user_id。在我们上面的示例中,我说过如果两个表中的user_id不匹配,则不会返回任何内容。 LEFT JOIN不是这样。相反,如果相同的情况属实,您将收到结果,就像您刚从主题表中选择的那样,以及名为username的列具有NULL结果。
  3. 右连接 - 与LEFT JOIN功能相同。我不能说我曾经使用过这个,因为我更喜欢使用LEFT JOIN。基本上,RIGHT JOIN查询看起来像SELECT t。*,u.username FROM topics t RIGHT JOIN users u ON u.user_id = t.user_id。这将为主题中的所有列提供所有用户名NULL。也许可以通过W3Schools上的This Article更好地解释这一点。
  4. 我希望这有帮助,如果你有任何进一步的问题,不要害怕问。