将多值属性存储在单个字段中并不是一个好主意.理想情况下,您将拥有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;
}
Run Code Online (Sandbox Code Playgroud)
它有点粗糙,准备好但它应该工作.此代码假定您有名为productName和的列tags.
如果您继续使用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;
}
Run Code Online (Sandbox Code Playgroud)
重要的部分是函数开头的SQL.它会为您提供相关产品.和他们一起做你想做的事!
| 归档时间: |
|
| 查看次数: |
7418 次 |
| 最近记录: |