I am trying to select a maximum of 2 rows where a column has the same value. ie:
我试图选择最多2行,其中列具有相同的值。即:
id title accountid date
1 job 1 1 Oct. 1
2 job 2 1 Oct. 1
3 job 3 1 Oct. 1
4 job 1 2 Oct. 2
5 job a 3 Oct. 2
6 job z 4 Oct. 3
7 job 2 2 Oct. 3
8 job 3 2 Oct. 8
I want to select
我想选择
1 job 1 1 Oct. 1
2 job 2 1 Oct. 1
<----- Skip this row because we already
have 2 from account 1
4 job 1 2 Oct. 2
5 job a 3 Oct. 2
6 job z 4 Oct. 3
7 job 2 2 Oct. 3
What I'm using right now to select is something like this:
我现在正在使用的选择是这样的:
SELECT *
FROM table
ORDER BY date DESC, RAND()
I've looked a bit into using HAVING COUNT(accountid) <= 2
but that's just led to confusion. I'm pretty new to using sql.
我看起来有点使用HAVING COUNT(accountid)<= 2但这只是导致混乱。我很擅长使用sql。
Thanks for your help!
谢谢你的帮助!
UPDATE:
更新:
Hi, thanks for all the quick responses. I've tried each of them and couldn't seem to get them to work. I figured out a way to limit the jobs per account id using php. Thanks again for your time and efforts to help me solve this.
嗨,谢谢你所有的快速反应。我已经尝试了他们每个人,似乎无法让他们工作。我想出了一种使用php限制每个帐户ID的作业的方法。再次感谢您花时间和精力帮助我解决这个问题。
3 个解决方案
#1
2
set @id := 0, @acid := 0;
select t.id, title, accountid, `date`
from
t
inner join (
select
id,
if(@acid = accountid, @i := @i + 1, @i := 1) as i,
@acid := accountid as acid
from t
order by accountid, `date` desc
) s on t.id = s.id
where s.i <= 2
#2
2
Hi this gonna solve your problem, but I don't know how quick this query will be.
嗨,这将解决您的问题,但我不知道这个查询有多快。
SQLFIDDLE示例
QUERY:
查询:
SELECT
id,
title,
accountid,
date
FROM
(SELECT
IF(@prev != a.accountid, @rownum:=1, @rownum:=@rownum+1) as rownumber,
@prev:=a.accountid,
a.*
FROM (
SELECT
t1.id,
t1.title,
t1.accountid,
t1.date
FROM tbl t1,
(SELECT @rownum := 0, @prev:='') sq
ORDER BY accountid, id) a
)b
WHERE b.rownumber<3
ORDER BY b.id
Result:
结果:
| ID | TITLE | ACCOUNTID | DATE |
-----------------------------------
| 1 | job 1 | 1 | Oct. 1 |
| 2 | job 2 | 1 | Oct. 1 |
| 4 | job 1 | 2 | Oct. 2 |
| 5 | job a | 3 | Oct. 2 |
| 6 | job z | 4 | Oct. 3 |
| 7 | job 2 | 2 | Oct. 3 |
#3
1
SELECT tab.id, tab.title, tab.accountid, tab.date
FROM table tab INNER JOIN table count_tab ON tab.id = count_tab.id
WHERE count_tab.id <= tab.id
GROUP BY tab.id, tab.title, tab.accountid, tab.date
HAVING count(count_tab.id) <= 2
#1
2
set @id := 0, @acid := 0;
select t.id, title, accountid, `date`
from
t
inner join (
select
id,
if(@acid = accountid, @i := @i + 1, @i := 1) as i,
@acid := accountid as acid
from t
order by accountid, `date` desc
) s on t.id = s.id
where s.i <= 2
#2
2
Hi this gonna solve your problem, but I don't know how quick this query will be.
嗨,这将解决您的问题,但我不知道这个查询有多快。
SQLFIDDLE示例
QUERY:
查询:
SELECT
id,
title,
accountid,
date
FROM
(SELECT
IF(@prev != a.accountid, @rownum:=1, @rownum:=@rownum+1) as rownumber,
@prev:=a.accountid,
a.*
FROM (
SELECT
t1.id,
t1.title,
t1.accountid,
t1.date
FROM tbl t1,
(SELECT @rownum := 0, @prev:='') sq
ORDER BY accountid, id) a
)b
WHERE b.rownumber<3
ORDER BY b.id
Result:
结果:
| ID | TITLE | ACCOUNTID | DATE |
-----------------------------------
| 1 | job 1 | 1 | Oct. 1 |
| 2 | job 2 | 1 | Oct. 1 |
| 4 | job 1 | 2 | Oct. 2 |
| 5 | job a | 3 | Oct. 2 |
| 6 | job z | 4 | Oct. 3 |
| 7 | job 2 | 2 | Oct. 3 |
#3
1
SELECT tab.id, tab.title, tab.accountid, tab.date
FROM table tab INNER JOIN table count_tab ON tab.id = count_tab.id
WHERE count_tab.id <= tab.id
GROUP BY tab.id, tab.title, tab.accountid, tab.date
HAVING count(count_tab.id) <= 2