SQL Select
8 отговора
784 прегледа
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
Данке предварително.
Има три вида хора. Част от проблема, част от решението и част от пейзажа.
Имам следното питане. Имам integer поле със примерни стойности:
10,11,13,14,15,16,18,19,20,22,24,26,27,28,29,30... т.н.
Как да SELECT-на само тези, след който има дупка (следващото не е с +1), т.е. в случая да се върне:
11, 16, 20, 22, 24
Данке предварително.
Има три вида хора. Част от проблема, част от решението и част от пейзажа.
Re: SQL Select
Може да кажеш на каква база данни си , защото се сещам за решение в Oracle което не е със ANSI SQL ...
Re: SQL Select
Пропуска е мой: MySQL 4.1.10
Има три вида хора. Част от проблема, част от решението и част от пейзажа.
Има три вида хора. Част от проблема, част от решението и част от пейзажа.
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
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
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;
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;
Re: SQL Select
Мерсаж, банда.
На phpGuru първия пример ми свърши работа на 100%. На salle също, но синтаксиса ми е малко тежък.
Поздрави.
На phpGuru първия пример ми свърши работа на 100%. На salle също, но синтаксиса ми е малко тежък.
Поздрави.
Редактирано от mr.vain на
Re: Би трябвало и двата да ти вършат работа
Двата варианта на phpGuru имам предвид.
Определено са по-изчистени от моето творение
да не говорим че и двата са напълно стандартни а на всичкото отгоре вторият вариант работи на всички версии на MySQL
Изобщо пиша си 2.5 (за работещо решение) и 6 на phpGuru
salle.online.bg/sig
Определено са по-изчистени от моето творение
Изобщо пиша си 2.5 (за работещо решение) и 6 на phpGuru
salle.online.bg/sig
Редактирано от salle на
Re: Би трябвало и двата да ти вършат работа
Eee, не се подценявай.
Виждал съм доста твои брилянтни включвания.
Има три вида хора. Част от проблема, част от решението и част от пейзажа.
Виждал съм доста твои брилянтни включвания.
Има три вида хора. Част от проблема, част от решението и част от пейзажа.
Re: Би трябвало и двата да ти вършат работа
благодаря, следващия път като се срещаме, ще си нося бележника да ми напишеш оценката :-))