如何用PHP从MySQL表不同列相同值中查询客户还看过的商品
问题排查
- 拼写错误:代码中表名写为
page_veiws,和实际表名page_views不符 - 逻辑错误:原有SQL实现的是「筛选被至少2个用户浏览过的所有商品」,和需求不匹配
正确SQL实现
查询逻辑为:先找到所有浏览过当前商品的非当前用户,再取这些用户浏览过的其他去重商品即可。
示例场景下的查询语句
你提供的场景中,当前商品为product_2,当前用户cookie_id为333333,对应查询语句:
SELECT DISTINCT item_id FROM page_views WHERE cookie_id IN ( SELECT DISTINCT cookie_id FROM page_views WHERE item_id = 'product_2' AND cookie_id != '333333' ) AND item_id != 'product_2';
执行后返回结果为product_1、product_3、product_7,完全符合需求。
业务代码适配版本
建议用预处理语句避免SQL注入,PHP写法参考:
// $current_product_id 为当前页面商品ID变量,$current_cookie_id 为当前用户cookie_id $stmt = $conn->prepare("SELECT DISTINCT item_id FROM page_views WHERE cookie_id IN (SELECT DISTINCT cookie_id FROM page_views WHERE item_id = ? AND cookie_id != ?) AND item_id != ?"); $stmt->bind_param("sss", $current_product_id, $current_cookie_id, $current_product_id); $stmt->execute(); $fetch_data = $stmt->get_result();
后续你可以直接用原有的foreach逻辑渲染返回的商品数据即可。
内容的提问来源于stack exchange,提问作者Anan
相关产品推荐
相关产品推荐

