编程语言
首页 > 编程语言> > php-在项目列表中显示喜欢该项目的用户

php-在项目列表中显示喜欢该项目的用户

作者:互联网

我认为这是不切实际的问题,但我希望得到一些反馈以确认.

我有一个产品和用户数据库,用户可以在其中喜欢产品,喜欢的数据只存储在pid和uid的引用表中.

客户要求显示3位用户喜欢产品列表中的每个产品.

问题是,无法通过一次查询获得产品列表中的数据,

我曾经实现并随后未实现的方法是,在产品列表循环期间,向喜欢该产品的用户执行请求.

即.

foreach($prods as $row):
$likers = $this->model->get_likers($row->id);
endforeach;

这行得通,但显然不仅会导致产品上市速度超慢,而且还会对数据库/ CPU造成很大的压力.

实施的最终解决方案是仅显示喜欢它的最新用户(可以从产品列表查询中的联接中获得),并具有显示有多少人喜欢的链接,并在单击该链接时打开一个ajax喜欢者列表.

所以我的问题是,实际上是否有一种技术可以在产品列表中显示喜欢的人,或者根本无法实际执行?我实际上注意到,对于大多数社交媒体网站,它们并不会在列表中显示所有喜欢的人,并且确实采用了“点击查看喜欢的人”方法.但是,它们的确在清单上的每个项目上显示评论,这实际上涉及相同的问题,不是吗?

任何帮助/指导将不胜感激!

谢谢

编辑:模拟附上所需的结果.每页将有30个产品.

解决方法:

通过阅读对Alex.Ritna的评论回复,是的,您可以获得x否.每个组的结果,使用GROUP_CONCAT()和SUBSTRING_INDEX(),它将显示用逗号或在查询中指定的任何分隔符(我使用过||)分隔的相似项.ORDERBY子句可在group_concat函数中使用.没有可用的架构信息,所以我假设您有一个产品表,一个用户表和一个维护用户与产品关系的联结表.在子字符串函数中,我使用了x = 3

SELECT p.*,
COUNT(*) total_likes,
SUBSTRING_INDEX(
GROUP_CONCAT( CONCAT(u.firstname,'  ',u.lastname)  ORDER BY some_column DESC SEPARATOR '||'),
'||',3) x_no_of_likers
FROM product p
LEFT JOIN junction_table jt ON(p.id=jt.product_id)
INNER JOIN users u  ON(u.id=jt.user_id)
GROUP BY p.id

Fiddle

现在,在您的应用程序级别,您只需要遍历产品并通过将每个产品的喜欢者分隔开来拆分x_no_of_likers

foreach($prods as $row):
$likers=explode('||',$row['x_no_of_likers']);
$total_likes= $row['total_likes'];
    foreach($likers as $user):
    ....
    endforeach;
endforeach;

请注意,在GROUP_CONCAT()上设置了默认的1024个字符限制,但您也可以按照GROUP_CONCAT()手册进行设置

从注释中编辑这是另一种获取每组n个结果的方法,您可以从其中获取用户表中的所有字段,我使用了一些变量来获取产品组的排名,使用了子查询来查询node_table来获取排名和外部选择我已经使用HAVING jt.user_rank< = 3过滤了具有该等级的记录,因此它将为每个产品提供三个用户记录,我还使用了产品的子查询(SELECT * FROM product LIMIT 30),因此前30个组将具有每个3结果,对于低于查询限制的结果不能在最后使用,所以我在子查询中使用了

SELECT p.id,p.title,u.firstname,u.lastname,u.thumbnail,jt.user_rank
FROM 
(SELECT * FROM `product` LIMIT 30 ) p
LEFT JOIN 
 (  SELECT j.*,
   @current_rank:= CASE WHEN @current_rank = product_id THEN  @user_rank:=@user_rank +1 ELSE @user_rank:=1 END  user_rank,
   @current_rank:=product_id
    FROM `junction_table` j ,
    (SELECT @user_rank:=0,@current_rank:=0) r   
    ORDER BY product_id 
  ) jt ON(jt.product_id = p.id)
  LEFT JOIN `users` u ON (jt.`user_id` = u.`id`) 
  HAVING jt.user_rank <=3 
  ORDER BY p.id

Fiddle n results per group

标签:performance,social,mysql,php,database
来源: https://codeday.me/bug/20191029/1962158.html