SQL Select

8 отговора 784 прегледа
#1

SQL Select

Здравейте.

Имам следното питане. Имам integer поле със примерни стойности:

10,11,13,14,15,16,18,19,20,22,24,26,27,28,29,30... т.н.

Как да SELECT-на само тези, след който има дупка (следващото не е с +1), т.е. в случая да се върне:
11, 16, 20, 22, 24

Данке предварително.

Има три вида хора. Част от проблема, част от решението и част от пейзажа.
Отговор
в отговор на mr.vain #2

Re: SQL Select

Може да кажеш на каква база данни си , защото се сещам за решение в Oracle което не е със ANSI SQL ...

Отговор
в отговор на Bobiander #3

Re: SQL Select

Пропуска е мой: MySQL 4.1.10

Има три вида хора. Част от проблема, част от решението и част от пейзажа.
Отговор
в отговор на mr.vain #4

Re: Идея ..

Ако предположим, че дупките са само от една стойност т.е. няма две или повече опследователни липсващи числа то ето го частното решение:

mysql> SELECT id2 - 1 FROM
(SELECT @i = id AS i, @i := id + 1 AS id2 FROM d ORDER BY id) AS t1
WHERE id2 NOT IN (SELECT id FROM d);
+---------+
| id2 - 1 |
+---------+
| 11 |
| 16 |
| 20 |
| 22 |
| 24 |
| 30 |
+---------+


Тук последният ред е излишен, но той е най-лесно да се изреже пък и той всъщност отговаря на усволието (следващият ред не съдържа +1 просто защото не същестува)

Освен това предположението което правя в началото също може да се изведе от начина по който поставяш условието

"тези, след който има дупка"
т.е. ако изтрием реда с 13 например то дупката състояща се от 12, 13 се намира след 11 и резултатът продължава да е верен:
mysql> delete from d where id = 13;
Query OK, 1 row affected (0.00 sec)

mysql> SELECT id2 - 1 FROM (SELECT @i = id AS i, @i := id + 1 AS id2 FROM d ORDER BY id) AS t1 WHERE id2 NOT IN (SELECT id FROM d);
+---------+
| id2 - 1 |
+---------+
| 11 |
| 16 |
| 20 |
| 22 |
| 24 |
| 30 |
+---------+

salle.online.bg/sig
Отговор
в отговор на mr.vain #5

Re: SQL Select

незнам дали ще работят точно на тази версия, ама ето 2 варианта

SELECT n.id FROM next_miss AS n WHERE NOT EXISTS (SELECT n2.id FROM next_miss AS n2 WHERE n2.id = n.id + 1);
SELECT n.id, n2.id FROM next_miss AS n LEFT OUTER JOIN next_miss AS n2 ON n2.id = n.id + 1 HAVING n2.id IS NULL;

Отговор
в отговор на phpGuru #6

Re: SQL Select

Мерсаж, банда.

На phpGuru първия пример ми свърши работа на 100%. На salle също, но синтаксиса ми е малко тежък.

Поздрави.

Редактирано от mr.vain на

Отговор
в отговор на mr.vain #7

Re: Би трябвало и двата да ти вършат работа

Двата варианта на phpGuru имам предвид.

Определено са по-изчистени от моето творение да не говорим че и двата са напълно стандартни а на всичкото отгоре вторият вариант работи на всички версии на MySQL

Изобщо пиша си 2.5 (за работещо решение) и 6 на phpGuru

salle.online.bg/sig

Редактирано от salle на

Отговор
в отговор на salle #8

Re: Би трябвало и двата да ти вършат работа

Eee, не се подценявай.
Виждал съм доста твои брилянтни включвания.

Има три вида хора. Част от проблема, част от решението и част от пейзажа.
Отговор
в отговор на salle #9

Re: Би трябвало и двата да ти вършат работа

благодаря, следващия път като се срещаме, ще си нося бележника да ми напишеш оценката :-))

Отговор