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
现在,在您的应用程序级别,您只需要遍历产品并通过将每个产品的喜欢者分隔开来拆分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
标签:performance,social,mysql,php,database 来源: https://codeday.me/bug/20191029/1962158.html