通过阅读您对 Alex.Ritna 的评论回复,是的,您可以获得 x 号。每组的结果,使用GROUP_CONCAT()
和SUBSTRING_INDEX()
它将显示用逗号或您在查询中指定的任何分隔符分隔的恋人(我使用了||)。ORDER BY
子句可以在 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 http://sqlfiddle.com/#!9/13a1f/10
现在,在您的应用程序级别,您只需循环遍历产品并拆分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;
请注意,默认设置了 1024 个字符限制GROUP_CONCAT()
但您也可以通过以下方式增加它GROUP_CONCAT() https://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat manual
根据评论编辑这是如何获取每组 n 个结果的另一种方法,从中您可以获取用户表中的所有字段,我使用了一些变量来获取产品组的排名,使用子查询junction_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 个结果 http://sqlfiddle.com/#!9/13a1f/8