SQL Sprung finden

chinamaschiene

Lt. Commander
Registriert
Mai 2008
Beiträge
1.257
hallo,

es würde mich sehr freuen wenn mir jemand kurz helfen könmnte. ich habe in einer tabelle nen spalte mit integern. die nehmen normal immer zu also von 1,2,3....1000 dann machen die nen sprung auf z.b 3 und gehen dann mit 4,5,6,7...3000 weiter und machen dann wieder nen sprung auf z.b. 14,15,16.... usw.

kann ich da dem mysql irgendwie befehlen das das mir die datensatz nummer von diesen sprungstellen ausgibt?

ich hoffe ihr habt mich verstanden ;-) wäre toll wenn das jemand weiß

viele grüße
 
Äh gibts da ein Sortierkriterium oder wie steht die Reihenfolge überhaupt fest? Ist die Spalte mit den Integern also kein Schlüssel? Gib mal paar Beispieldaten.
Und welche Datenbank liegt vor (wenn sie lag() unterstützt wäre es praktisch)?
 
die datensätze haben nen nummer die von 1-unendlich läuft als id (primary key). spalte zwei ist die mit den integern die kein key ist. es gibt also nur steigend dann fallend und dann wieder steigen usw.
nach einem fall auf einen beliebigen kleineren wert steigt der auch brav jedes mal um 1 wieder an bis er wieder fällt usw...

z.b.
id,integer
1,1
2,2
3,3
4,4
5,2
6,3
7,4
8,1
9,2
10,3

da waren jetzt also 2 sprünge. ich will also datensatz 4 bzw 5 und datensatz 7 bzw 8 haben. datenbank ist mysql 5 denke ich.

ich zeichne das schnell grob. die achse nach oben ist dann der integer. die mit x markierten ids brauche ich also. ich hoffe man versteht das...

Code:
^      /|       /|
|     / |  /|  / |   /
|    /  | / | /  |  /
|   /   |/  |/   | /
|  /             |/
--------------------> id (key)
        x   x    x

geht das überhaupt mit mysql?

vielleicht irgentwas mit select id where integer(id+1) != integer(id)+1...
 
Zuletzt bearbeitet:
Angenommen der Primärkey ist durchgängig vergeben:
Code:
Select id,integer from [tabelle] a
where not exists(
  Select 1 from [tabelle] b
  where b.id = a.id + 1
  and b.integer = a.integer + 1
) and a.id < (Select Max(id) from [tabelle])

Falls der Primärkey nicht durchgängig vergeben ist:
Code:
Select id,integer from [tabelle] a
where not exists(
  Select 1 from [tabelle] b
  where b.id = (Select Min(id) from [tabelle] c where c.id > a.id)
  and b.integer = a.integer + 1
) and a.id < (Select Max(id) from [tabelle])

Es wird damit jeweils der Datensatz ausgegeben, der noch ok ist (in deinem Beispiel also 4 und 7). Will man die andern beiden haben sieht es so aus:
Code:
Select id,integer from [tabelle] a
where not exists(
  Select 1 from [tabelle] b
  where b.id = a.id - 1
  and b.integer = a.integer - 1
) and a.id > (Select Min(id) from [tabelle])
Code:
Select id,integer from [tabelle] a
where not exists(
  Select 1 from [tabelle] b
  where b.id = (Select Max(id) from [tabelle] c where c.id < a.id)
  and b.integer = a.integer - 1
) and a.id > (Select Min(id) from [tabelle])
Wenn du beide (4 und 5 sowie 7 und 8) haben willst kannst du die beiden Abfragen ja mit nem "Union" verbinden:
Code:
Select id,integer from [tabelle] a1
where not exists(
  Select 1 from [tabelle] b1
  where b1.id = a1.id + 1
  and b1.integer = a1.integer + 1
) and a1.id < (Select Max(id) from [tabelle])
Union
Select id,integer from [tabelle] a2
where not exists(
  Select 1 from [tabelle] b2
  where b2.id = a2.id - 1
  and b2.integer = a2.integer - 1
) and a2.id > (Select Min(id) from [tabelle])
Code:
Select id,integer from [tabelle] a1
where not exists(
  Select 1 from [tabelle] b1
  where b1.id = (Select Min(id) from [tabelle] c1 where c1.id > a1.id)
  and b1.integer = a1.integer + 1
) and a1.id < (Select Max(id) from [tabelle])
Union
Select id,integer from [tabelle] a2
where not exists(
  Select 1 from [tabelle] b2
  where b2.id = (Select Max(id) from [tabelle] c2 where c2.id < a2.id)
  and b2.integer = a2.integer - 1
) and a2.id > (Select Min(id) from [tabelle])

Wenn die integer-Spalte nicht immer um exakt eins aufsteigend ist könnte man auch einfach die "b.integer = a.integer + 1" durch ein "b.integer > a.integer" (bzw. andersrum für "-1") ersetzen.
 
Zuletzt bearbeitet:
wow danke für diese lange und extrem ausführliche antwort. du scheinst ja echt sehr viel ahnung von sql zu haben. also der primary key (id) ist durchgängig vergeben. habe das 1. query jetzt mal mit folgenden daten getestet:

Code:
id         integer
 1 |       1 |                      
|  2 |       2 |                      
|  3 |       3 |                      
|  4 |       4 |                      
|  5 |       5 |                      
|  6 |       6 |                      
|  7 |       7 |                      
|  8 |       8 |                      
|  9 |       9 |                      
| 10 |      10 |                      
| 11 |      11 |                      
| 12 |      12 |                      
| 13 |      13 |                      
| 14 |      14 |                      
| 15 |      15 |                      
| 16 |      16 |                      
| 17 |      17 |                      
| 18 |      18 |                      
| 19 |      19 |                      
| 20 |      20 |                      
| 21 |       1 |                      
| 22 |       2 |                      
| 23 |       3 |                      
| 24 |       4 |                      
| 25 |       5 |                      
| 26 |       6 |                      
| 27 |       7 |                      
| 28 |       8 |                      
| 29 |       9 |                      
| 30 |      10 |                      
| 31 |       1 |                      
| 32 |       2 |                      
| 33 |       3 |                      
| 34 |       4 |                      
| 35 |       5 |                      
| 36 |       6 |                      
| 37 |       7 |                      
| 38 |       8 |                      
| 39 |       9 |
| 40 |      10 |
| 41 |       1 |
| 42 |       2 |
| 43 |       3 |
| 44 |       4 |
| 45 |       5 |
| 46 |       6 |
| 47 |       7 |
| 48 |       8 |
| 49 |       9 |
| 50 |      10 |
| 51 |      11 |
| 52 |      12 |
| 53 |      13 |
| 54 |      14 |
| 55 |      15 |
| 56 |      16 |
| 57 |      17 |
| 58 |      18 |
| 59 |      19 |
| 60 |      20
=> 60 rows
query:

select id,integer from table1 a where not exists( select 1 from backup b where b.id = a.id + 1 and b.integer = a.integer + 1 ) and a.id < (select max(id) from table1);

antwort:
Code:
21 |       1 |                                                                                                                                                 
| 22 |       2 |                                                                                                                                                 
| 23 |       3 |                                                                                                                                                 
| 24 |       4 |                                                                                                                                                 
| 25 |       5 |                                                                                                                                                 
| 26 |       6 |                                                                                                                                                 
| 27 |       7 |                                                                                                                                                 
| 28 |       8 |                                                                                                                                                 
| 29 |       9 |                                                                                                                                                 
| 30 |      10 |                                                                                                                                                 
| 31 |       1 |                                                                                                                                                 
| 32 |       2 |                                                                                                                                                 
| 33 |       3 |                                                                                                                                                 
| 34 |       4 |                                                                                                                                                 
| 35 |       5 |                                                                                                                                                 
| 36 |       6 |                                                                                                                                                 
| 37 |       7 |                                                                                                                                                 
| 38 |       8 |                                                                                                                                                 
| 39 |       9 |                                                                                                                                                 
| 40 |      10 |                                                                                                                                                 
| 41 |       1 |                                                                                                                                                 
| 42 |       2 |                                                                                                                                                 
| 43 |       3 |                                                                                                                                                 
| 44 |       4 |                                                                                                                                                 
| 45 |       5 |                                                                                                                                                 
| 46 |       6 |                                                                                                                                                 
| 47 |       7 |                                                                                                                                                 
| 48 |       8 |                                                                                                                                                 
| 49 |       9 |                                                                                                                                                 
| 50 |      10 |                                                                                                                                                 
| 51 |      11 |                                                                                                                                                 
| 52 |      12 |                                                                                                                                                 
| 53 |      13 |                                                                                                                                                 
| 54 |      14 |                                                                                                                                                 
| 55 |      15 |                                                                                                                                                 
| 56 |      16 |                                                                                                                                                 
| 57 |      17 |                                                                                                                                                 
| 58 |      18 |                                                                                                                                                 
| 59 |      19 |
==>39 rows

ich würde mich in dem fall aber nur für die ids 20,30,40 interesieren. bzw. 21,31,41 also nur eine antwort mit 4 reihen erhalten.
 
Zuletzt bearbeitet:
Äh was ist das?
select id,integer from table1 a where not exists( select 1 from backup b where b.id = a.id + 1 and b.integer = a.integer + 1 ) and a.id < (select max(id) from table1);
Normalerweise sollte das Ergebnis nämlich so sein wie du es willst.
 
Zuletzt bearbeitet:
huch.. das ist wohl meine dummheit die den fehler erklärt ;-) gut das ich das query doch nochmal gepostet habe. jetzt erhalte ich als ergebnis
Code:
id        integer
20 |      20 |
| 30 |      10 |
| 40 |      10

EDITich bin schon etwas müde.

die antwort ist natürlich genau die die ich erwarte und wollte. VIELEN VIELEN DANK für deine tolle hilfe um diese nächtliche zeit. ich hoffe ich kann mich irgendwann mal revanchieren.

:schluck:

p.s.
morgen werde ich dann mal mich dran machen das zu verstehen. die queries sehen wirklich sehr interesant und fortgeschritten aus...
 
Zuletzt bearbeitet:
Wieso 50? Da steigt es doch an?

Edit: Ok, du hast doch noch selbst gemerkt.
Beruflich habe ich eben mit deutlich komplexere Geschichten zu tun, insofern ist das kein großes Problem für mich. Das sind ja hier nur ein paar recht simple Subqueries.
 
Zuletzt bearbeitet:
hab ich schon bemerkt und den post bereits korrigiert. das hast du wohl nicht mehr gesehen. wenn dich der grund aber dennoch interesiert:

Ich schrieb:
EDITich bin schon etwas müde.

Nochmals tausend dank für deine extrem kompetente hilfe!
 
Zurück
Oben