我试图找出链接到博文的所有标签,并使用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'];
}
}
答案 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返回一个字符串。