限制sql查询中一列的连续值

时间:2010-04-23 00:59:08

标签: sql mysql join

我有一个具有以下结构的表:

id           -int(11)
event_id     -int(11)
photo_id     -int(11)
created_at   -datetime

如何编写将返回最近100行的查询,但确保photo_id中的连续行数不超过4行具有相同的值

5 个答案:

答案 0 :(得分:3)

您可以添加一个where子句,用于过滤掉存在photo_id个较低行的4行:

select *
from YourTable t1
where 4 > (
    select count(*)
    from YourTable t2
    where t1.event_id = t2.event_id
    and t1.photo_id < t2.photo_id
)
limit 100

对于大型桌子来说,这会变得很慢。更快但非常特定于MySQL的选项是使用变量。例如:

select *
from (
    select
        @nr := case 
            when event_id = @event then @nr + 1 
            else 1 
        end as photonr
    ,   @event := event_id
    ,   t1.*
    from YourTable as t1
    cross join (select @event := -1, @nr := 1) as initvars
    order by event_id
) as subquery
where subquery.photonr < 5
limit 100;

使用的测试数据:

drop table if exists YourTable;

create table YourTable (
  id int auto_increment primary key
, event_id int
, photo_id int
);

insert into YourTable (event_id, photo_id)
values (1,1), (1,2), (1,3), (1,4), (1,5), (2,1), (1,6);

答案 1 :(得分:0)

我会说这样的话会让你走上正轨:

$sql = "SELECT DISTINCT * FROM myTable ORDER BY id ASC LIMIT 100";

在这种情况下,“DISTINCT”将仅检索不同的行并忽略重复的行。

希望它有所帮助。

答案 2 :(得分:0)

在oracle中,你会使用滞后函数

LAG  (value_expression [,offset] [,default]) OVER ([query_partition_clause] order_by_clause)

不确定mySQL是否可行。

答案 3 :(得分:0)

如果您使用的是T-SQL,请查看http://msdn.microsoft.com/en-us/library/ms189798.aspx以获取排名功能。

从你的问题来看,NTILE就像你想要的那样。这是我对查询的快速尝试,我不是在终端,所以没有检查,但它应该让你开始:

SELECT
  id,
  event_id,
  photo_id,
  created_at,
  NTILE(4) OVER (ORDER BY photo_id) AS 'Quartile'
FROM tbl
WHERE NTILE(4) OVER (ORDER BY photo_id)<2
ORDER BY created_at DESC

链接页面是所有排名功能的一个很好的例子。

祝你好运

答案 4 :(得分:0)

试试这个:

SELECT p.id, p.event_id, p.photo_id, p.created_at
FROM photo_table p,
    (

        SELECT photo_id, MAX(created_at) max_date
        FROM photo_table
        GROUP BY photo_id 
    ) t
WHERE p.created_at = t.max_date
        AND p.photo_id = t.photo_id
ORDER BY p.created_at DESC
LIMIT 100

它的作用是: 1.找到最新的照片更改日期 2.只查找每张照片的最后事件 3.选择前100个最近的

在PostgreSQL或Oracle中,使用analytica / windowing函数会更简单,例如:

FIRST (created_at) OVER (PARTITION BY photo_id ORDER BY created_at DESC)