在我的数据库中,我有一个包含产品的表和另一个包含与每个产品相关联的标签的表。
当用户查看产品页面时,我想显示与他正在查看的产品最“相关”(或最接近)的产品。
假设产品标有 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/