使用3个链接表

时间:2018-02-03 13:48:14

标签: php

我试图找出链接到博文的所有标签,并使用3个表来存储博客文章,标签和tag_link_blog这样

+------------------+-------------+-----------------+
| BLOG POST TABLE  | TAGS        |  TAGS_LINK_BLOG |
+------------------+-------------+-----------------+
| ID               |  ID         |  ID             |
| TITLE            |  TAG        |  TAG_ID         |
| POST             |             |  BLOG_ID        |
| ++++             |             |                 |
+------------------+-------------+-----------------+

我已经编写了一些代码来获取与我请求的博客文章相关的标记名称,但它首先运行数据库查询以获取博客文章及其ID(必须(无论哪种方式完成),然后使用该ID执行新查询并选择与该博客帖子ID相关的标签ID,然后选择最后一个查询以获取与标签ID相关的TAG名称。

我之前从未使用像这样链接在一起的表格,但是,我猜测它必须是更好的方法。所以下面是我现在使用的代码。这是一种可行的方法,还是有更好更快的方式?

$db_conn = new Database(); // connect to database
$stmt = $db_conn->connect->prepare("SELECT TAG_ID FROM `TAGS_LINK_BLOG` WHERE BLOG_ID = $id"); // prepare statement
$stmt->execute(); // select from database
$result = $stmt->get_result(); // Get the result

$tag_id = [];

// Push tag id to array
while ($row = $result->fetch_assoc()) {
    array_push($tag_id, $row['TAG_ID']);
}

$db_conn->free_close($result, $stmt); // free result and close db connection

// Get tag name by the tag id
foreach($tag_id as $tags) {

    $db_conn = new Database(); // connect to database
    $stmt = $db_conn->connect->prepare("SELECT TAG FROM `TAGS` WHERE ID = $tags"); // prepare statement
    $stmt->execute(); // select from database
    $result = $stmt->get_result(); // Get the result

    while ($row = $result->fetch_assoc()) {

        echo $row['TAG'];

    }

}

1 个答案:

答案 0 :(得分:1)

我偶尔在连接多个表后使用group_concat将多个标记分组到一个结果中。 SQL就是这样。

SELECT b.id, GROUP_CONCAT(t.tag SEPARATOR ' ') as tags
FROM blog_post_table b
LEFT JOIN tags_link_blog tlb ON tlb.blog_id = b.id
LEFT JOIN tags t ON t.id = tbl.tag_id
GROUP BY b.id

然后在返回结果之后,您将只需要一个循环来遍历结果集。你还需要explode(" ",$row[$tag])返回数组,使其成为自己的数组,因为group concat返回一个字符串。