这与我到目前为止找到的解决方案有点不同。我与用户和公司之间有关系(用户具有company_id列)。我需要创建一个查询,以获取每个公司的前5个用户。以下内容总共获得前3个用户:
SELECT * FROM users WHERE company_id IN (1, 2, 3, ...) LIMIT 3;
而不是每个公司的前3个用户。现在,我正在遍历PHP中的公司,并运行一个查询,该查询使用带有的公司ID来抓住用户LIMIT 3
,但是有可能有100个公司,所以这根本不起作用。如果我有自己的ID,是否可以让我获得公司列表中的前“ n”个用户?
在MySQL中,最简单的方法可能是使用变量:
SELECT u.*
FROM (SELECT u.*,
(@rn := if(@c = company_id, @rn + 1,
if(@c := company_id, 1, 1)
)
) as seqnum
FROM users u CROSS JOIN
(SELECT @c := -1, @rn := 0) params
WHERE u.company_id IN (1, 2, 3, ...)
ORDER BY u.company_id
) u
WHERE seqnum <= 3;
注意:SQL表表示无序集。除非有列指定顺序,否则没有“前三个”之类的东西。如果您有这样一列,则将其作为第二个关键字包括在中ORDER BY
。
变量说明。MySQL不保证中的表达式求值顺序SELECT
。因此,不应该在一个表达式中引用变量然后在另一个表达式中设置变量-您不知道哪个变量将首先运行。上面的公式是在做正确的事情的同时在单个表达式中设置变量的一种方式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句