查询相关产品

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个新表:tagproduct_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;

这有点粗糙和准备好了,但它应该可以工作。此代码假定您有名为 productNametags 的列。

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 带有 ProductTableProductTagsTable 以及另一个 ProductsXTagsTable 以保持产品和标签表之间的连接,或者您可以编辑帖子并显示带有查询的示例快速搜索相关产品?

以上是关于查询相关产品的主要内容,如果未能解决你的问题,请参考以下文章

从 WooCommerce 中的相关产品中排除产品类别

如何按ID排序不随机化Woocommerce的相关产品

从 mongodb 集合中过滤掉相关产品

Django添加Q过滤器以查询相关对象存在时,条件查询

相关子查询 MySQL

需要 MS Access 数据库查询帮助