这是我的实际查询:
$result = mysqli_query($link,"select ids_billets from pref_tags where id='$_GET[id]'");
$tags_ids = $result->fetch_object();
$result = mysqli_query($link,"select id, html from pref_posts where id in ($tags_ids->ids_billets)");
while($posts = $result->fetch_object()) {
.....
}
我在pref_tags表的一个varchar字段中有id(ids_billets) - 例如:“12,16,158”
有更好的方法来查询吗? 感谢
答案 0 :(得分:1)
我将创建一个将帖子与标签相关联的新表,而不是一行以逗号分隔的列表,每个帖子/标签组合一行,即:
posts
---------------------
post_id | html | etc.
posts_tags
----------------
post_id | tag_id
tags
------------------------
tag_id | tag_name | etc.
然后做这样的事情:
SELECT p.post_id, p.html
FROM posts p
INNER JOIN posts_tags pt
ON p.post_id = pt.post_id
INNER JOIN tags t
ON pt.tag_id = t.tag_id
WHERE t.tag_name = ?
或者,如果您已经拥有tag_id
,就像您似乎:
SELECT p.post_id, p.html
FROM posts p
INNER JOIN posts_tags pt
ON p.post_id = pt.post_id
WHERE pt.tag_id = ?
您还可以使用子查询以不同的形式执行相同的查询:
SELECT post_id, html
FROM posts
WHERE post_id IN (SELECT post_id FROM posts_tags WHERE tag_id = ?)
另外,请查看prepared statements,这样可以轻松避免当前代码出现严重的SQL注入问题。
答案 1 :(得分:1)
您应该不将多个值放在一个列中,因为这样做会导致first normal form。请查看该链接,了解您可能遇到的问题的示例,以及如何解决这些问题。
而是创建一个单独的表,您可以在其中将ID和标记ID放在不同的列中。然后,您可以在第二个示例查询中提取子查询中的ID,和可以获得在其他查询中搜索和操作个人ID的好处。