如何按列值限制查询

时间:2018-04-04 19:23:39

标签: mysql sql graphql

以下查询...

SELECT event_id, user_id FROM EventUser WHERE user_id IN (1, 2)

...给我以下结果:

+----------+---------+
| event_id | user_id |
+----------+---------+
|        3 |       1 |
|        2 |       1 |
|        1 |       1 |
|        5 |       1 |
|        4 |       1 |
|        6 |       1 |
|        4 |       2 |
|        2 |       2 |
|        1 |       2 |
|        5 |       2 |
+----------+---------+

现在,我想修改上面的查询,以便我只为每个user_id获取两行,例如:

+----------+---------+
| event_id | user_id |
+----------+---------+
|        3 |       1 |
|        2 |       1 |
|        4 |       2 |
|        5 |       2 |
+----------+---------+

我正在考虑这样的事情,当然这不起作用:

SELECT event_id, user_id FROM EventUser WHERE user_id IN (1, 2) LIMIT 2 by user_id

理想情况下,这也适用于偏移量,因为我想将它用于分页。

出于性能原因,必须使用查询的WHERE user_id IN (1, 2)部分。

4 个答案:

答案 0 :(得分:0)

一种方法 - 假设每个用户至少有两行 - 将是:

(select min(event_id) as event_id, user_id
 from t
 where user in (1, 2)
 group by user_id
) union all
(select max(event_id) as event_id, user_id
 from t
 where user in (1, 2)
 group by user_id
);

不可否认,这不是一般的“解决方案”,但它可能是您想要的最简单的解决方案。

如果你想要两个最大或最小,那么另一种选择也可以:

select t.*
from t
where t.user_id in (1, 2) and
      t.event_id >= (select t2.event_id
                     from t t2
                     where t2.user_id = t.user_id
                     order by t2.event_id desc
                     limit 1, 1
                    );

答案 1 :(得分:0)

以下是此类问题的动态示例,请注意此示例在SQL Server中运行,暂时无法尝试使用mysql。请让我知道它是如何工作的。

CREATE TABLE mytable
    (
      number INT,
      score INT
    )

INSERT  INTO mytable VALUES  ( 1, 100)
INSERT  INTO mytable VALUES  ( 2, 100)
INSERT  INTO mytable VALUES  ( 2, 120)
INSERT  INTO mytable VALUES  ( 2, 110)
INSERT  INTO mytable VALUES  ( 3, 120)
INSERT  INTO mytable VALUES  ( 3, 150)

SELECT *
FROM mytable m
WHERE 
        (
            SELECT  COUNT(*) 
            FROM    mytable  m2
            WHERE   m2.number = m.number AND 
                    m2.score >= m.score
        ) <= 2

答案 2 :(得分:0)

这个怎么样?

SELECT event_id, user_id 
FROM (
      SELECT event_id, user_id, row_number() OVER (PARTITION BY user_id) AS row_num 
      FROM EventUser WHERE user_id in (1,2)) WHERE row_num <= n;

n可以是任何

答案 3 :(得分:0)

后来,但帮助使用了派生表和交叉联接。 对于本文中的示例,查询将为:

SELECT 
@row_number:=CASE
    WHEN @user_no = user_id 
      THEN 
          @row_number + 1
      ELSE 
           1
    END AS num,
@user_no:=user_id userid, event_id 
FROM
EventUser,
(SELECT @user_no:=0,@row_number:=0) as t
group by user_id,event_id
having num < 3;

更多信息,this link