我想在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
答案 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
值表示日期小于所需日期的会议数。您可以使用此值作为应用程序中增量的基础,类似于上述两种查询方法所描述的内容。