kinski
29.06.2005, 07:11:44
Mam tabelę z zakresami: w jednej kolumnie jest początek zakresu, a w drugiej - koniec zakresu.
Np Kolumna A Kolumna B Zakres
1 4 4
7 10 4
16 23 8
Jak można z bazy wydobyć zakresy między moimi rekordami, czyli w tym przykładzie 5-6 i 11-15?
nospor
29.06.2005, 08:07:28
Spróbuj wyrazić się jaśniej. i co to za kolumna Zakres. I skąd ci sie wziely wartości: 5-6 i 11-15 (wytlumacz)
kinski
29.06.2005, 08:13:14
Spróbuj wyrazić się jaśniej. i co to za kolumna Zakres. I skąd ci sie wziely wartości: 5-6 i 11-15 (wytlumacz)
Zakres = KolumnaB - KolumnaA + 1, czyli ilość wszystkich numerów w danym zakresie. Wartości 5-6 i 11-15 to te, których nie ma w zakresach, a chcę je znaleźć
nospor
29.06.2005, 08:23:54
Dzięki za wyjaśnienia. Teraz wszystko jasne.
No to chyba się tego nie da zapytaiem zrobić. Będziesz chyba musiał to w php zrobić.
kinski
29.06.2005, 08:26:35
Ale jak? Czy mozesz mi pomoc?
nospor
29.06.2005, 08:47:03
a czy te zakresy mogą nachodzic na siebie? tzn.czy moze zaisteniec tak sytuacja:
1 4 4
2 10 11
8 12 5
?
kinski
29.06.2005, 08:48:56
Nie mogą, każdy zakres następuje nie wcześniej niż po końcu poprzedniego.
nospor
29.06.2005, 09:05:26
No dobra. napisalem skrypcik:
<?php
$zakresy[0]['begin'] = 1;
$zakresy[0]['end'] = 4;
$zakresy[1]['begin'] = 7;
$zakresy[1]['end'] = 10;
$zakresy[2]['begin'] = 16;
$zakresy[2]['end'] = 23;
$in = 0;
for ($i = 0; $i < $size - 1; $i++ )
{
if ($zakresy[$i]['end']+1 < $zakresy[$i+1]['begin'] )
{
$missing[$in]['begin'] = $zakresy[$i]['end']+1;
$missing[$in]['end'] = $zakresy[$i+1]['begin']-1;
$in++;
}
}
foreach ($missing as $zakres)
{
echo \"{$zakres['begin']} - {$zakres['end']} <br>\"; }
?>
twoim zdaniem będzie pobrać z bazy swoje zakresy i wpisać je do tablicy $zakresy. CHyba umiesz pobierać dane z bazy? Jak nie to poczytaj se mysql_query() i mysql_fetch_array().
MOżesz również generować brakujace zakresy na bieżąco podczas pobierania danych z bazy. Bedziesz musial jednak ten skrypt wówczas troche zmodyfikowac. Powodzenia
SongoQ
29.06.2005, 09:09:00
Ja bym zrobil na zasadzie zlaczenia LEFT JOIN i wykuczyl te rzeczy ktore sie powtarzaja. Wtedy dostajemy te wartosci ktore nie wystepuja.
nospor
29.06.2005, 09:13:04
@SongoQ zaintrygowales mnie

. Aczkolwiek rozwiń swoją myśl bo jakoś nie zakumałem Twej logiki. Jakoś tego nie widzę. Co z tego ze wykluczysz jakieś rekordy? co to ma do nie istniejących liczb?
SongoQ
29.06.2005, 09:43:25
@nospor Chodzilo mi o cos takiego.
SELECT
(t1.b + 1) AS aa,
(t1.a - 1) AS bb
FROM tabela t1
LEFT JOIN tabela t2 ON (t1.a = t2.b + 1)
WHERE t2.b IS NULL
Zwraca przedzialy, tylko trzeba uwzglednic dolny zakres. Pisalme szybko wiec moglem jeszce czegos nie uwzglednic.
nospor
29.06.2005, 09:54:49
@SongoQ wow, a ja glupi skrypt w php pisalem (może komus sie przyda). Muszę czasami jednak przemyśleć sql a potem rezać skrypty

. Twój sql dziala. Otrzymalem takie wyniki:
5 0
11 6
24 15
Wystarczy teraz na krzyż polaczyc i sie otrzyma przedzialy 5-6, 11-15
SongoQ
29.06.2005, 10:03:27
Cytat
Wystarczy teraz na krzyż polaczyc i sie otrzyma przedzialy 5-6, 11-15
No tak, zastanawiam sie czy nie dalo by sie odrazu bez zadnych podselektow zrobic.
kinski
29.06.2005, 11:08:43
Czegoś nie rozumiem... Czy mogę połączyć tabelę ze samą sobą? U mnie to wygląda tak:
SELECT
(tabela1.ostatni_numer + 1) AS ostatni_numer,
(tabela1.pierwszy_numer - 1) AS pierwszy_numer
FROM tabela1
LEFT JOIN tabela1 ON (tabela1.pierwszy_numer = tabela1.ostatni_numer + 1)
WHERE tabela1.ostatni_numer IS NULL
I nie działa. Gdzie zrobiłem błąd?
nospor
29.06.2005, 11:10:38
NIee robisz aliasów . Zobacz, że w rozwiązaniu @SongoQ są aliasy, czyli
...tabela t1... tabela t2....
SongoQ
29.06.2005, 11:10:46
SELECT
(tabela1.ostatni_numer + 1) AS ostatni_numer,
(tabela1.pierwszy_numer - 1) AS pierwszy_numer
FROM tabela1 t1
LEFT JOIN tabela1 t2 ON (t1.pierwszy_numer = t2.ostatni_numer + 1)
WHERE t2.ostatni_numer IS NULL
kinski
29.06.2005, 11:34:14
Zastosowałem Twoe zapytanie SongoQ, ale wyskoczył mi komunikat, że nie może znaleźć kolumny ostatni_numer
nospor
29.06.2005, 11:57:58
kolega @SongoQ jedynie zmodyfikowal Twoj kod. A masz wogole kolumne ostatni_numer?
Jak masz to spróbuj ewentualnie tak:
SELECT
(tabela1.ostatni_numer + 1) AS ostatni_numer2,
(tabela1.pierwszy_numer - 1) AS pierwszy_numer2
FROM tabela1 t1
LEFT JOIN tabela1 t2 ON (t1.pierwszy_numer = t2.ostatni_numer + 1)
WHERE t2.ostatni_numer IS NULL
kinski
29.06.2005, 12:24:09
Kolumnę ostatni_numer mam na pewno! :-) Poza tym Jak robię samego selecta to jest ok - Problem pojawia się kiedy do zapytania dodam złączenie.
SongoQ
29.06.2005, 12:46:43
mama pomylka.
ma byc (t1.ostatni_numer + 1) AS ostatni_numer2,
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.