php - 基于动态数量的条件查询数据库

标签 php mysql database-design

我正在构建一个“标签”系统。我引用它是因为它不完全是一个标签系统,但足够接近。

显然,在处理标签时,用户很可能会使用多个标签并期望对结果进行更深入的过滤。

我遇到的问题是如何准确地做到这一点。

到目前为止,我可以想到两种方法,但如果有人能解释正确的方法,我将不胜感激。

方式 1) 对每个标签进行单独查询,然后对数据进行排序/组合/播放。 方式2)

SELECT i2t.item_id
FROM Item2Tag i2t
INNER JOIN Tag t
ON i2t.tag_id = t.tag_id
WHERE t.tag_text IN ('beach','cloud','waves')
GROUP BY i2t.item_id

以上是我的查询。这是基于 Toxi 解决方案的修改版本。希望您能明白发生了什么……本质上有 3 个表,1 个用于信息,1 个用于标签,另一个用于连接它们。

这就是我目前正在做的事情:我用变量替换“海滩”、“云”、“波浪”。然后,在 PHP 代码中,我将数组转换为字符串,每个单词用逗号分隔,然后将其插入查询中。所以类似:

foreach ($tagarray as $tag){
$string = .$tag1.", " }

这当然有点过于简化,因为我需要正确地结束最后一个标签而不用逗号..但希望你能明白这一点。

因此,$string 等于 'tag1, tag2, tag3'

SELECT i2t.item_id
FROM Item2Tag i2t
INNER JOIN Tag t
ON i2t.tag_id = t.tag_id
WHERE t.tag_text IN ('$string')
GROUP BY i2t.item_id

有更好的方法吗?

最佳答案

这 3 个表的数据库结构很好。但你的查询有一点问题。你不是一种语法。让我们举个例子。用户搜索带有标签“a”和“b”的内容。如果您的内容仅包含标签“a”,它将作为结果出现。还包含仅带有“b”标签的内容。您应该附加查询,例如:

有 COUNT(t.tag_id) = x

,其中 x 是您正在查询的标签数量的长度(在我的示例中为 2,在您的示例中为 3)。这样,如果给定集合的所有项目都匹配,则内容将被视为结果。仅当这些表中没有重复条目时,此方法才有效。

此外,使用内爆代替循环。

$string = implode(",", $tagarray);

这样您就不需要费心删除最后一个逗号。

关于php - 基于动态数量的条件查询数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9840846/

相关文章:

database - 访问权限数据库设计

sql - 这个社交媒体平台 PostgreSQL 数据库设计正确吗?

php - 显示更新值时,$_GET 返回未定义索引错误,但在正常重定向时 $_GET 方法给出正确的值

c# - 在 c# 中替代 php 的 explode/implode-functions

php - Apache 正在下载 php 文件而不是显示它们

C#——从 MySQL 检索数据并在 "pages"中对它们进行排序,而不使用 DataGridView

php - 无法使用php将图像上传到mysql

Mysql 更新字段与其他 2 个字段之间的最大值

MySQL - 重复表

MongoDB结构: single collection vs multiple smaller collections