Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Pierwszy i ostani wiersz w ciągu tych samych wartości, Jak to wybrać
fragles
post
Post #1





Grupa: Zarejestrowani
Postów: 110
Pomógł: 0
Dołączył: 14.12.2008

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
skowron-line
post
Post #2





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


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ć.


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
fragles
post
Post #3





Grupa: Zarejestrowani
Postów: 110
Pomógł: 0
Dołączył: 14.12.2008

Ostrzeżenie: (0%)
-----


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

Ten post edytował fragles 14.07.2009, 11:21:12
Go to the top of the page
+Quote Post
maly_swd
post
Post #4





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

Ostrzeżenie: (0%)
-----


a W mySqlu przez procedure? raczej powinno sie dac


--------------------
śmieszne obrazki
Kryzys: Ser jem spleśniały, wino piję stare i samochód mam bez dachu..
Go to the top of the page
+Quote Post
nexis
post
Post #5





Grupa: Zarejestrowani
Postów: 1 012
Pomógł: 109
Dołączył: 26.09.2003
Skąd: nexis.pl

Ostrzeżenie: (0%)
-----


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ś.


--------------------
Zend Certified Engineer

Kliknij POMÓGŁ jeśli moja odpowiedź okazała się użyteczna!
Go to the top of the page
+Quote Post
fragles
post
Post #6





Grupa: Zarejestrowani
Postów: 110
Pomógł: 0
Dołączył: 14.12.2008

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
erix
post
Post #7





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Możesz podać praktyczne zastosowanie?


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
nexis
post
Post #8





Grupa: Zarejestrowani
Postów: 1 012
Pomógł: 109
Dołączył: 26.09.2003
Skąd: nexis.pl

Ostrzeżenie: (0%)
-----


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.


--------------------
Zend Certified Engineer

Kliknij POMÓGŁ jeśli moja odpowiedź okazała się użyteczna!
Go to the top of the page
+Quote Post
fragles
post
Post #9





Grupa: Zarejestrowani
Postów: 110
Pomógł: 0
Dołączył: 14.12.2008

Ostrzeżenie: (0%)
-----


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ć

Ten post edytował fragles 15.07.2009, 12:16:12
Go to the top of the page
+Quote Post
SzamanGN
post
Post #10





Grupa: Zarejestrowani
Postów: 94
Pomógł: 14
Dołączył: 11.10.2007

Ostrzeżenie: (0%)
-----


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


--------------------
SzamanGN
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 12:31