MySQL限制与WHERE IN子句

时间:2016-01-29 03:14:23

标签: mysql

这与我迄今为止找到的解决方案略有不同。我在用户和公司之间有关系(用户有一个company_id列)。我需要创建一个查询,获取每个公司的前5个用户。以下是前3位用户总数:

SELECT * FROM users WHERE company_id IN (1, 2, 3, ...) LIMIT 3;

而不是每个公司的前3个用户。现在我正在循环使用PHP中的公司,并运行一个查询,用LIMIT 3通过公司的ID来抓取用户,但是可能有100个公司,所以这根本不具备性能。如果我有他们的ID,我有办法让公司名单的第一个'n'用户?

1 个答案:

答案 0 :(得分:3)

在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中表达式的评估顺序。因此,变量不应该在一个表达式中引用然后在另一个表达式中设置 - 您不知道哪个将首先运行。上述公式是一种在做正确的事情时将变量设置在单个表达式中的方法。