在mysql中编号行

时间:2014-10-22 19:32:19

标签: php mysql

我想在mysql中对选定的行进行编号。我的会议桌结构:

id | date
4  | 2014-09-29 
5  | 2014-10-06
6  | 2014-10-13 
7  | 2014-10-20 
8  | 2014-10-27
9  | 2014-11-03
10 | 2014-11-10

所以我只想选择今天更大的日期行,结果应该是:

id | date        | meeting number
8  | 2014-10-27  | 5
9  | 2014-11-03  | 6
10 | 2014-11-10  | 7

2 个答案:

答案 0 :(得分:1)

您可以使用自联接按date

的顺序对行进行编号
select t1.id, t1.date, count(*) meeting_number
from mytable t1
join mytable t2 on t1.date >= t2.date
where t1.date > current_date()
group by t1.id

使用变量的另一种方法,如果您在同一天有多个会议

select id, date, meeting_number
from (
    select *, 
    (@meeting_number := @meeting_number + 1) meeting_number
    from mytable cross join (select @meeting_number := 0) t1
    order by date
) t1 where date > current_date()

答案 1 :(得分:0)

我不会选择完全按照您的意愿返回SQL结果的解决方案。为什么?因为它可能涉及复杂的查询,该查询无法正确利用索引,因此性能很差。让我给你几个备选方案。

首先。只需使用两个查询:

SELECT COUNT(id) As row_count
FROM meetings
WHERE meeting_date < ?

并阅读row_count的值。或者只是

SELECT id
FROM meetings
WHERE meeting_date < ?

使用num_rows类型函数来获取行数(根本不需要读出结果集)。

这将为您提供不符合条件的会议数量。将此号码存储在您的应用程序中,然后定期查询

SELECT id
FROM meetings
WHERE meeting_date >= ?
ORDER BY meeting_date ASC

只需从先前存储的值开始递增,即可获得所需的meeting_number进行显示。

这两个查询可能比在结果集中完成增量的更复杂查询快得多。

作为另一个建议,您可能还会考虑使用这样的内容来获取一个查询中所需的所有数据

SELECT
    CASE
        WHEN meeting_date < ? THEN 0
        ELSE id
    END AS identifier,
    CASE
        WHEN meeting_date < ? THEN '2000-01-01' /* Or some sufficiently old date */
        ELSE meeting_date
    END AS meeting_date,
    COUNT (id) AS id_count
FROM meetings
GROUP BY identifier
ORDER BY meeting_date ASC

这会产生一个结果集:

identifier | date        | id_count
0          | 2000-01-01  | 4
8          | 2014-10-27  | 1
9          | 2014-11-03  | 1
10         | 2014-11-10  | 1

此处,第一行的id_count值表示日期小于所需日期的会议数。您可以使用此值作为应用程序中增量的基础,类似于上述两种查询方法所描述的内容。