0

这是我的实际查询:

$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 表 (ids_billets) 的一个 varchar 字段中有 id - 例如:“12,16,158”

有没有更好的方法来查询这个?谢谢

4

2 回答 2

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注入问题。

于 2013-08-15T17:36:49.480 回答
1

您不应该多个值放在单个列中,因为这样做会破坏第一范式。查看该链接,了解您可能遇到的问题以及如何解决这些问题的示例。

相反,创建一个单独的表,您可以在其中将 ID 和标签 ID 放在单独的列中。然后,您可以在第二个示例查询中拉回子查询中的 ID,获得能够在其他查询中搜索和操作单个 ID 的好处。

于 2013-08-15T17:38:20.257 回答