从另一张桌子获取记录

时间:2014-01-08 15:20:41

标签: php mysql

我正在尝试读取所有数据,但另一个表中有一条记录。我可以在一个查询中与其他记录一起阅读吗?

 $sql_query="SELECT * FROM blog_posts ORDER BY id DESC";

// table to display results here // modify here 
echo '<h1>'.$rows["title"].'</p></h1>';
echo '<p> '.$rows["post"].'</p>';
echo '<p><span class="style1">Door</span>: '.$rows["first_name"].' ';
echo '<p>Geplaatst op</span>: '.$rows["date_posted"].'</p>';                           
echo "<BR>";

记录:first_name来自表:人。其余的全部来自blog_posts。

3 个答案:

答案 0 :(得分:4)

在您的查询中使用LEFT JOIN,如下所示

SELECT * FROM blog_posts
LEFT JOIN people
ON blog_posts.{USERIDCOLUMNNAME}=people.{USERIDCOLUMNNAME}
ORDER BY blog_posts.id DESC; 

或者像劳尔在评论中发表的那样定义每一栏:

SELECT people.name as name, blog_posts.title as title, blog_posts.post as post FROM blog_posts,people WHERE blog_posts.people_id=people.id ORDER BY id DESC 

答案 1 :(得分:2)

叫我疯了,但看起来first_name是另一个表中的字段而不是整个记录。因此,我认为您正在寻找的方法是将您的blog_posts表与您的人员表联系起来。你怎么做,虽然完全取决于这种关系:一对一,一对多,或多对多。

如果它是一对一的(可能不是),那么你很可能在两个表中都有一个外键到另一个表(即有一个blog_post.people_id字段和一个people.blog_post_id领域)。如果是这种情况,那么执行连接的方式无关紧要。由于您已经从blog_posts表中进行选择,因此它可能如下所示:

SELECT * FROM blog_posts
    INNER JOIN people ON blog_posts.people_id = people.id

请注意,在选择时以这种方式使用*将选择两个表中的所有字段(不是您想要的,最有可能)。

对于一对多,其中一个表上只有一个外键。这可能是您的情况:一个人可以撰写许多文章,并且关系存储在字段blog_posts.person_id中。在这种情况下,上面的查询完全相同。唯一的区别是你不能走另一条路

对于多对多关系,您必须在两个表之间的中间有一个连接表(有些人将这些表称为'pivot'表)。此表只需要记录people_ids和blog_post_ids,并且表示允许许多人创作单个博客帖子的情况,以及单个人也可以作为许多博客帖子的作者。对这种关系的查询会有所不同:

SELECT * FROM blog_posts b
    INNER JOIN blog_post_people bp ON bp.blog_post_id = b.blog_post_id
    INNER JOIN people p ON p.people_id = bp.people_id

同样,在选择时使用* here将为您提供所有三个表中的列,您应该避免使用它。

答案 2 :(得分:0)

您可以从多个表格中选择

$sql_query="SELECT * FROM blog_posts,people WHERE people.id=$id"; ORDER BY id DESC