PHP:左连接2表并打印所有记录

时间:2014-03-22 10:41:45

标签: php mysql

我的数据库中有两个表记录,如下所示:

表1列1:

topic_id    name
21          my computer

表2,列如下:

reply_id    topic_id    message
    1           21       blabla
    2           21       blue

表2中的topic_id列是表1的外键

我想回复表2中的所有回复以及表1中的主题名称(#21)。所以,我做了这样的查询

$q="SELECT name, message
FROM table1
LEFT JOIN table2
ON table1.topic_id = table2.topic_id
";

但是,结果/输出返回主题的名称和仅一个回复,但不是预期的2(或全部)。我错过了什么吗?

我使用了LEFT JOIN,因为有些主题仍在等待回复。如果没有任何回复,主题的名称仍会在浏览器中打印。

我也尝试添加

GROUP BY table1.topic_id

但仍然没有运气!

你能帮忙吗?感谢

编辑:为了澄清问题,我添加了PHP代码来获取记录,如下所示:

如您所知,名称只需打印一次。所以,我这样编码:

$tid = FALSE;
if(isset($_GET['qid']) && filter_var($_GET['qid'], FILTER_VALIDATE_INT, array('min_range'=>1) ) ){

// create the shorthand of the question ID:

$tid = $_GET['tid'];

// run query ($q) as shown above

$r = mysqli_query($dbc, $q) or die("MySQL error: " . mysqli_error($dbc) .     "<hr>\nQuery: $q");
if (!(mysqli_num_rows($r) > 0) ){

    $tid = FALSE; // valid topic id

}


}//isset($_GET['qid']

if ($tid) { //OK

    $printtopic = FALSE; // flag variable to print topic once

        while($content = mysqli_fetch_array($r, MYSQLI_ASSOC)){

            if (!$printtopic) {
              echo $content['name'];
              $printtopic= TRUE;
           }

      }
} // end of $tid

// Print the messages if any:
echo $content['message'];

3 个答案:

答案 0 :(得分:1)

使用内部联接

尝试此操作
$q="SELECT name, message
FROM table1
INNER JOIN table2
ON table1.topic_id = table2.topic_id";

答案 1 :(得分:0)

尝试:

$q="SELECT table2.reply_id, table1.name, table2.message
FROM table2
LEFT JOIN table1
ON table1.topic_id = table2.topic_id
";

答案 2 :(得分:0)

在努力解决这个问题后,我发现问题是我必须将查询更改为INNER JOIN并添加WHERE子句,如下所示:

WHERE table2.reply_id = {the given topic_id}

然后它运作良好!

抱歉打扰你们所有人!