LINUX.ORG.RU

Запрос к таблице в MySQL

 ,


0

2

Есть таблица:

T_id Ev_id            DateTime
1      1         2012-11-18 00:01:00
2      1         2012-11-18 00:02:00
3      2         2012-11-18 00:03:00
4      1         2012-11-18 00:04:00
5      1         2012-11-18 00:05:00
6      1         2012-11-18 00:06:00
7      2         2012-11-18 00:07:00
8      2         2012-11-18 00:08:00
9      2         2012-11-18 00:09:00
10     1         2012-11-18 00:10:00
11     2         2012-11-18 00:11:00

Необходимо выбирать строки с первыми вхождениями событий (Ev_id):

1      1         2012-11-18 00:01:00
3      2         2012-11-18 00:03:00
4      1         2012-11-18 00:04:00
7      2         2012-11-18 00:07:00
10     1         2012-11-18 00:10:00
11     2         2012-11-18 00:11:00

Будьте добры, подскажите, пожалуйста, как в MySQL реализовать подобный запрос.

Спасибо!


в программе которая эти данные генерирует отслеживать факт перехода 1 в 2 и 2 в 1 и для каждой первой записи после перехода специальный флаг типа flag_revert устанавливать в true а для всех остальных записей в false. в SQL выводить записи с этим флагом установленным в true.

quest ★★★★
()
DELIMITER $$
DROP PROCEDURE IF EXISTS `pTest`$$
CREATE PROCEDURE `pTest`()
BEGIN
  DECLARE done,i,a,b INT DEFAULT 0;
  DECLARE d CHAR(16);
  DECLARE cur CURSOR FOR SELECT id,Ev_id FROM tablename;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

  OPEN cur;
  WHILE done = 0 DO
    FETCH cur INTO a,b;
    IF i = 0 || i <> b THEN
        SET i = b;
        SET d = CONCAT_WS(',',d,a);
    END IF;
  END WHILE;
  CLOSE cur;

  SET @r = CONCAT('SELECT * FROM tablename WHERE id IN(', d, ')');
  PREPARE res FROM @r;
  EXECUTE res;
END$$
DELIMITER ;


mysql> CALL `pTest`;
+----+-------+---------------------+
| id | Ev_id | DateTime            |
+----+-------+---------------------+
|  1 |     1 | 2012-11-18 00:01:00 |
|  3 |     2 | 2012-11-18 00:03:00 |
|  4 |     1 | 2012-11-18 00:04:00 |
|  7 |     2 | 2012-11-18 00:07:00 |
| 10 |     1 | 2012-11-18 00:10:00 |
| 11 |     2 | 2012-11-18 00:11:00 |
+----+-------+---------------------+
6 rows in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)
Возможно есть варианты и проще

Wolfram
()
Ответ на: комментарий от Wolfram

Еще вариант

SELECT *
FROM tablename a
WHERE Ev_id NOT IN 
(SELECT Ev_id
    FROM tablename
    WHERE id = (SELECT max(id) FROM tablename WHERE id < a.id) 
) ORDER BY id;

Wolfram
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.