fragles
14.07.2009, 10:53:46
Przykładowo w jednej z kolumn mam wartości poukładane w taki sposób, że dane w tej kolumnie wyglądają w następujący sposób
1,1,1,1,2,2,2,3,4,4,4,4,4,4,4,5,5,6,6,6,7,7,7,8,9,10,10
chciałbym w zbiorze wynikowym mieć pierwszą i (jeśli jest) ostatnią, wartość z danego podzbioru (jedynek, dwójek, trójek itd)
czyli
1,1,1,1,2,2,2,3,4,4,4,4,4,4,4,5,5,6,6,6,7,7,7,8,9,10,10,10
zbiór wynikowy składałby się z pogrubionych i powiększonych wartości (jak widac powyżej) tylko, że nie mam pomysłu jak to zrobić, trzeba by znać wartość następnego wiersza i nie wiem jak to zrobić
może ktoś będzie miał pomysł, będę wdzięczny
skowron-line
14.07.2009, 10:59:16
W mysql tego nei zrobisz.
W php zrob sobie explode po ',' i w pętli przeleć sprawdzająć poprzednia wartosc z obecna i na tej podstawie pogrubiać.
fragles
14.07.2009, 11:20:29
Cytat(skowron-line @ 14.07.2009, 11:59:16 )

W mysql tego nei zrobisz.
W php zrob sobie explode po ',' i w pętli przeleć sprawdzająć poprzednia wartosc z obecna i na tej podstawie pogrubiać.
coś tak czułem, że tak będzie

i że będzie to odebrane jako wiersz
to jest kolumna - zapisałem w poziomie, żeby mniej miejsca zajęło i napisałem, że to kolumna, czyli powinno to być odebrano jako:
1
1
1
1
2
2
2
3
4
4
4
itd...
reszta zostaje po staremu
maly_swd
14.07.2009, 11:20:59
a W mySqlu przez procedure? raczej powinno sie dac
nexis
14.07.2009, 12:17:03
A według czego są sortowane te wartości? Być może uda się to zrobić za pomocą dodatkowych warunków, o których nie napisałeś.
fragles
14.07.2009, 13:35:49
Cytat(nexis @ 14.07.2009, 13:17:03 )

A według czego są sortowane te wartości? Być może uda się to zrobić za pomocą dodatkowych warunków, o których nie napisałeś.
Właśnie nie bardzo - to 1,1,1,1,2,2,2 itd
to jest dodatkowa kolumna, która powstaje wg porównania wierszy bieżącego z poprzednim - warunek niespełniony zostaje ta sama wartość, warunek spełniony nowa wartość (zwiększona o jeden) . Dzięki temu wiem ile mam "grup". Teraz potrzebuję wybrać wartości graniczne - aby przedstawić, że OD WAR_1 DO WAR_2 to jest grupa 1 - OD WAR_3 DO WAR_4 grupa 2 i tak po kolei
ja wiem, że mozna to zrobić w PHP czy Smarty (i tak na razie robię), ale mi chodzi o to, żeby spróbować to zrobić w MySQL-u, chociażby po to aby oszczędzić na nadmiarowości danych, wybrac te, które są niezbędne
erix
14.07.2009, 15:14:04
Możesz podać praktyczne zastosowanie?
nexis
14.07.2009, 15:44:56
Cytat(fragles @ 14.07.2009, 14:35:49 )

to jest dodatkowa kolumna, która powstaje wg porównania wierszy bieżącego z poprzednim - warunek niespełniony zostaje ta sama wartość, warunek spełniony nowa wartość (zwiększona o jeden) . Dzięki temu wiem ile mam "grup". Teraz potrzebuję wybrać wartości graniczne - aby przedstawić, że OD WAR_1 DO WAR_2 to jest grupa 1 - OD WAR_3 DO WAR_4 grupa 2 i tak po kolei
Być może sam stawiasz sobie przeszkodą i można to rozwiązać w inny sposób. Musiałbyś to jednak bardziej opisać, żebyśmy mogli pomóc.
fragles
15.07.2009, 12:14:29
Coś tam wykombinowałem polega to na zadeklarowaniu w procedurze kursora, i potem w pętli robie co chcę i byłoby wszystko idealnie gdyby nie mały ale istotny problem.
Potrzebuję w zapytaniu zmiennych zdefiniowanych przez użytkownika chodzi o zmienne zaczynające się od małpy czyli eta czyli @.
Wyglądają one tak:
SET @v1 = b'1000001';
SET @v2 = CAST(b'1000001' AS UNSIGNED), @v3 = b'1000001'+0;
Chcialbym taką zmienną dodać do zapytania, zwyczajnie jest mi potrzebna żeby coś przechować, cos wyliczyć.
Z zapytania chciałbym zrobić kursor
czyli np
DECLARE row_cur CURSOR FOR
SELECT kol1,kol2,kol3,@nr:=@nr+1
FROM tab1
WHERE kol1=war_1 AND kol2=war_2;
Ale tu zaczyna się problem:
1) nie moge przed DECLARE row_cur CURSOR FOR ustawić SET @nr=1 a bez tego mam nule nie liczby
2) jak coś chcę obliczyć bardziej skomplikowanego to mi się zawiesza zapytanie
Jak sobie z tym poradzić, jak to obejść
________________________________________________________________________________
_____________
Poradziłem sobie tak - jeśli ktoś miałby kiedyś podobny problem podaję w punktach
1 - tworzę dwie procedury, jedna wywoływaną w PHP drugą wywoływaną w pierwszej
2 - w tej wywoływanej z PHP umieszczam zmienne użytkownika SET @v1 :=0 itd
3 - potem w procedurze drugiej tworzę kursor z zapytaniem ze zmiennymi użytkownika
4 - w pętli w procedurze drugiej sprawdzam czy się ten numer (z pierwszego wpisu tego wątku, ten co jest w kolumnie) zmienił, jeśli tak to zapisuje do tabeli wynikowej poprzedni i bieżący (wartości graniczne)
5 - pobieram dane z tabeli wynikowej i wysyłam na przeglądarkę
nie wklejam kodu bo te dwie procedury to ponad 200 linii
jak ktoś będzie miał uwagi, że można to zrobić, lepiej, wydajniej, ładniej itp - chętnie posłucham, chętnie sprawdzę, co prawda działa, ale nie wiem czy działa najlepiej jak może czy da się to jakoś ulepszyć
SzamanGN
15.07.2009, 12:31:12
Nie testowałem, ale sprawdź:
SELECT z.kolumna,
(SELECT p.id_rekordu FROM tabela AS p WHERE p.kolumna=z.kolumna ORDER BY p.kolumna ASC LIMIT 1 ) AS pierwszy,
(SELECT o.id_rekordu FROM tabela AS o WHERE o.kolumna=z.kolumna ORDER BY o.kolumna DESC LIMIT 1 ) AS ostatni
FROM tabela AS z
ORDER BY z.kolumna ASC