查询相关产品
Posted
技术标签:
【中文标题】查询相关产品【英文标题】:Query for related products 【发布时间】:2011-03-16 09:00:20 【问题描述】:我有产品的详细信息页面,我想添加一个“相关产品”模块。
在数据库表“products”中,我为每个产品存储了一个名为“tags”的值,例如“tag1、tag2、tag3、tag4”。
现在我需要构建一个查询来检索与至少 2 个此标签匹配的所有产品,不包括详细信息页面中显示的主要产品的 id。例如:
主要产品
产品名称 |标签1,标签2,标签3,标签4
相关产品:
产品名称 |标签1,标签3,标签5
产品名称 |标签3,标签4,标签6,标签7
我不确定最好的方法是 SQL...也许是使用数组的 php 函数?
谢谢。
【问题讨论】:
有没有办法可以标准化标签列?即创建2个新表:tag
和product_tag
@Dennis Haarbrink:是的,我可以有新的桌子......
【参考方案1】:
将多值属性存储在单个字段中并不是一个好主意。理想情况下,您应该有一个 Products 表、一个 Tags 表和一个 ProductTags 表。
但是,您可以选择产品的标签并使用explode()
来获取标签数组。对于其他产品,执行相同操作并使用array_intersect
来获取公共元素数组。然后用count() > 1
判断是否相关
所以:
function getRelatedProducts($productName)
$productResults = mysql_query("SELECT * FROM products WHERE productName = '$productName' LIMIT 0,1");
$relatedProducts = array();
if(mysql_num_rows($productResults) == 1)
$product = mysql_fetch_array($productResults);
$tags = explode(",",$product['tags']);
$otherProducts = mysql_query("SELECT * FROM products WHERE productName != '$productName'");
while($otherProduct = mysql_fetch_array($otherProducts))
$otherTags = explode(",",$otherProduct['tags']);
$overlap = array_intersect($tags,$otherTags);
if(count($overlap > 1)) $relatedProducts[] = $otherProduct;
return $relatedProducts;
这有点粗糙和准备好了,但它应该可以工作。此代码假定您有名为 productName
和 tags
的列。
PHP:array_intersect - Manual
如果您继续使用 product_tags 表,您可以使用以下代码查找相关产品:
function getRelatedProducts($productId)
$sql = "SELECT p.*,COUNT(*) AS matchedTags FROM products p
INNER JOIN product_tags pt ON pt.product_id = p.id
WHERE pt.tag_id IN (SELECT tag_id FROM product_tags WHERE product_id = $product_id)
GROUP BY p.id
HAVING COUNT(*) > 1";
$results = mysql_query($sql);
$relatedProducts = array();
while($result = mysql_fetch_array($results))
$relatedProducts[] = $result;
return $relatedProducts;
重要的部分是函数开头的 SQL。它会给你相关的产品。随心所欲地对待他们!
【讨论】:
感谢布伦丹!无论如何,如果你建议我有一个标签表和一个 product_tags 表,我会这样移动。但是,我如何查询数据库?我想标签表应该有:id,tag_name。和product_tags:id、product_id、tag_id @Luciano 完全正确。您可以在 product_tags 表的 product_id 和 tag_id 之间设置唯一索引,以防止产品上出现重复标签。 太棒了!再次感谢您的答案和示例,真的很有帮助! this 示例搜索会快吗?【参考方案2】:其他人指出this,comma,separated,tag,list并不是一个好主意。这是真的,我知道很难。
如果你必须使用它,你可以使用表服务器来过滤你的结果集 WHERE tag LIKE '%searchtag%'
但是这个搜索词会很慢,并且会返回误报命中。 您最好创建一个 product_tags 表,其中每个产品的每个标签都有一行。
【讨论】:
您的意思是 this example 带有ProductTable
和 ProductTagsTable
以及另一个 ProductsXTagsTable
以保持产品和标签表之间的连接,或者您可以编辑帖子并显示带有查询的示例快速搜索相关产品?以上是关于查询相关产品的主要内容,如果未能解决你的问题,请参考以下文章