将多值属性存储在单个字段中并不是一个好主意。理想情况下,您应该有一个 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。它会给你相关的产品。随心所欲地对待他们!