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

标签 php mysql sql join html-table

我对PHP和MYSQL非常陌生。我知道我应该使用MYSQLI,但是在这种情况下我没有该选项,所以请多多包涵!

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

表A
用户名|主题|日期评分

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

表C
主题|描述

然后,我在PHP页面中创建了一个表,该表在TableA中显示信息,并在每行中都带有“详细信息”按钮。

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

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

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

| 2 | 01 | 2012年11月11日|在此按钮|

| 3 | 02 | 2012年12月11日|在此按钮|

| 2 | 03 | 2012年11月1日|在此按钮|

| 5 | 04 | 2012年11月11日|在此按钮|

单击第一行中的按钮时:

|用户名|用户名|用户邮箱|话题

| 01 |名称01 | usermail 1 |主题描述|

| 03 |名称03 |用户邮件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>';
    }


请,有人可以帮助我下一步做什么吗?

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

最佳答案

很抱歉,但是我无法完全理解您的要求,也不知道这些表之间的关系。我假设表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中只有“超人或蝙蝠侠”,而对该“蝙蝠侠”线程的第一个注释将在posts表中。

现在,假设我在论坛上,所以我想查看所有主题以决定应该在哪里发布。这是通过完成

$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。然后我们将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语句。根据我的解释,这是区别


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


希望对您有所帮助,如果您还有其他疑问,请不要害怕提出。

关于php - 根据第三表行显示来自两个组合表的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19746545/

相关文章:

sql - 为什么 SQL Server 的 SOUNDEX 给我不一致的结果?

php - 更新两行以进行加法和减法

sql - 如何按升序选择表格的最后三行?

C++ 项目到 linux

php - 如何通过语言环境字符串获取日历类型

php - 如果复选框被选中循环并检索相应的文本字段值

mysql - 现有的 MySQL 数据库未导入到本地主机

mysql - 在rails中,如何查询连接表中的字段?

php - MySQL、PHP - 动态产品功能的搜索引擎(在另一个表中)

php - preg_replace() 标签名称