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


Displaying data from two combined tables according to third table row

我对PHP和MYSQL非常陌生。我知道我应该使用 MYSQLI,但在这种情况下我没有这个选项,所以请耐心等待!

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

表 A用户标识 |主题 |日期 |额定值

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

表 C主题 |描述

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

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

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

|主题|用户ID|日期 |详情 |

| 2 | 01 |2012-11-11 |按钮在这里 |

| 3 | 02 |2012-11-12 |按钮在这里 |

| 2 | 03 |2012-01-11 |按钮在这里 |

| 5 | 04 |2012-08-11 |按钮在这里 |

单击第一行中的按钮时:

| 用户标识 | 用户名 | 用户邮箱 | 主题 |

| 01 | 名称01 |用户邮件 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 就像主题数据库表,我也假设表 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 />';
}

这是连接表的最基本版本。它说我将从主题中选择所有内容,并从用户中选择用户名,其中用户表上的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)

有一天,你必须使用左连接、右连接和/或内部连接语句。根据我的解释,以下是差异

  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 行,在本例中为"用户"。如果找不到相应的行,它将返回一个空值。即,如果我在主题帖子上有 user_id = 1,并且user_id实际上是 2,这不会返回任何内容。
  2. 左联接 - 将右表中的数据添加到从左侧选择的数据上。这篇关于W3Schools的文章对此进行了快速分解。基本上,它将始终从原始表中选择,并将为任何其他结果返回NULL。语法与 INNER JOIN 相同,只需将 INNER 替换为 LEFT。因此,我们将从主题 t 左加入用户 u 在 u.user_id=t.user_id 上获得选择 t.*。在上面的示例中,我说过,如果两个表中的user_id不匹配,则不会返回任何内容。左联接则不然。相反,如果相同的情况为真,您将收到结果,就像您刚刚从主题表中进行选择一样,以及一个名为用户名的列,其结果为 NULL。
  3. 右联接 - 与左联接功能相同。我不能说我曾经经常使用过这个,因为我更喜欢使用左连接。基本上,右联接查询看起来像从主题中选择 t.*, u.username 在 u.user_id=t.user_id 上右联接用户。这将为主题中的所有列提供所有用户名和 NULL。这也许可以通过这篇关于W3Schools的文章得到更好的解释。