php - MYSQL与多个WHERE获得最接近的匹配

标签 php mysql

在我的数据库中,我有一个包含产品的表和另一个包含与每个产品相关联的标签的表。

当用户查看产品页面时,我想显示与他正在查看的产品最“相关”(或最接近)的产品。

假设产品标有 5 个不同的标签。我想获得具有相同 5 个标签的产品,然后是具有相同 5 个标签中的 4 个的产品,然后是具有相同 5 个标签中的 3 个的产品,等等......

要做到这一点,我猜我必须创建一个或多个 MYSQL 查询,但我什至不知道从哪里开始。

匹配相同的 5 个标签很容易,我可以只使用 WHERE tag='?' AND tag='?'...但是我怎样才能得到另一个 (4/5, 3/5, 2/5, 1/5)?

如有任何帮助,我们将不胜感激!

干杯 史蒂文


编辑

@Orbits:我的标签都在不同的行上……如果不是,我可能会进行文本匹配,但情况就是这样。标签行由 (id, tag, product_id) 组成

@cusimar9:不同的表,如帖子中所述:P

@vbence:我相信它尽可能简单..这是......但我没有连接表

产品:

CREATE TABLE `products` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  ...
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

标签:

CREATE TABLE `tags` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `type` varchar(70) NOT NULL,
  `product_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=116 ;

最佳答案

当然,字符串文字 'Tag1' 等必须替换为您的标签。

SELECT products.id, COUNT(tags.id) AS match_level
FROM products
    LEFT JOIN tags ON tags.product_id = product.id
WHERE tags.type IN ('Tag1', 'Tag2', 'Tag3', 'Tag4', 'Tag5')
GROUP BY products.id
ORDER BY match_level DESC

如果您还没有这样的索引,请将其添加到您的 tags 表中。没有索引,您就是在浪费资源。好时光。

CREATE INDEX multimatch ON tags (type, product_id);

关于php - MYSQL与多个WHERE获得最接近的匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5195264/

相关文章:

php - 对行求和并插入新列

PHP/MySQL 安全问题

python - 与 Python 保持在同一个 Shell session 中

sql - mysql结果集加入现有表

php - Laravel 创建动态时间表

php - 如何使用 Faker 在 Laravel 中播种多个关系

c# - 如何将此 PHP 脚本转换为 C#?

php - 制作事件日志的最有效方法

mysql - MySQL 查询 153 秒,我做错了什么?

php - 如何制作MySQL的WEE​​K()和YEARWEEK()函数?