Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pierwszy i ostani wiersz w ciągu tych samych wartości
Forum PHP.pl > Forum > Bazy danych > MySQL
fragles
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
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
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 smile.gif 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
a W mySqlu przez procedure? raczej powinno sie dac
nexis
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
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
Możesz podać praktyczne zastosowanie?
nexis
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
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
Nie testowałem, ale sprawdź:
  1. SELECT z.kolumna,
  2. (SELECT p.id_rekordu FROM tabela AS p WHERE p.kolumna=z.kolumna ORDER BY p.kolumna ASC LIMIT 1 ) AS pierwszy,
  3. (SELECT o.id_rekordu FROM tabela AS o WHERE o.kolumna=z.kolumna ORDER BY o.kolumna DESC LIMIT 1 ) AS ostatni
  4. FROM tabela AS z
  5. ORDER BY z.kolumna ASC
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.