在mysql或更好的地方?

时间:2013-08-15 17:29:43

标签: mysql

这是我的实际查询:

$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”

有更好的方法来查询吗? 感谢

2 个答案:

答案 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的好处。