Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL]Pobieranie rekordu z bazy zależne od innego rekordu
marekdominikowsk...
post
Post #1





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 16.11.2013

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


Cześć

Mam tabelę, w której w jednej z kolumn znajdują się jakieś powtarzające się wartości. Niech to będą na przykład A, B, C, D, E, F. Potrzebuję pobrać np. rekordy A, ale tylko te, które występują bezpośrednio po np. B albo po np. B lub C.

Na przykład:

1. B
2. A
3. D
4. A
5. C
6. A
7. B
8. A

Dla "A po B" zapytanie zwróci rekordy 2 i 8.
Dla "A po B lub C" zapytanie zwróci rekordy 2, 6 i 8.

Jak takie zapytanie skonstruować?
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Jesi chcesz to zrobic tylko na poziomie baze, to musisz skorzystac ze zmiennych w mysql.

W zmiennej przechowujesz aktualną wartosc, a przy nastepnym rekordzie porownujesz ją do B lub C. Ot i wszystko smile.gif


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
mmmmmmm
post
Post #3





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


  1. /*
  2. create table xxc(id int, x varchar(10));
  3. insert into xxc values(1, 'B'),(2, 'A'), (3, 'D'),(4, 'A'), (5, 'C'), (6, 'A'), (7, 'B'), (8, 'A');
  4. */
  5.  
  6. -- 1.
  7. SELECT x1.id FROM xxc x1 JOIN xxc x2 ON x1.id=x2.id+1
  8. WHERE x1.x='A' AND x2.x IN ('B');
  9. -- 2.
  10. SELECT x1.id FROM xxc x1 JOIN xxc x2 ON x1.id=x2.id+1
  11. WHERE x1.x='A' AND x2.x IN ('B', 'C');

Tak na szybko... Dlatego MUSI zachodzić warunek ciągłości id.
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Moja wersja nie wymaga ciaglosci wink.gif


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
mmmmmmm
post
Post #5





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


Moja też nie...:
  1. SELECT x1.id FROM xxc x1 JOIN (SELECT x, (SELECT Min(id) FROM xxc WHERE xxc.id>t.id) id FROM xxc t) x2 ON x1.id=x2.id
  2. WHERE x1.x='A' AND x2.x IN ('B', 'C')

Tamta była pisana "na szybko" smile.gif
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Moja jest wydajniejsza, wymaga tylko i wylacznie jednego glownego SELECT a nie jakis dzikich kombinacji wink.gif

Twoja ma jednak jedną wielka zalete: jest podana na tacy, podczas gdy moją autor musi sam sklecic wink.gif Podejrzewam wiec, ze twoja w oczach autora jest lepsza.


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
mmmmmmm
post
Post #7





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


To raczej taka 'wprawka' dla samego siebie... Staram się wszystko rozwiązać via SQL. I to najlepiej w bazie. Na razie nie mam z tym problemów... Co więcej - piszę w czystym ANSI SQL. Powyższe zadziała zarówno w MySQL, jak i postgreSQL. Jakbym miał "typowane" to wtedy bym optymalizował...
Go to the top of the page
+Quote Post
nospor
post
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Ale moje tez jest na czystej bazie. zero php czy innych takich pierdol smile.gif


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
marekdominikowsk...
post
Post #9





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 16.11.2013

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


Dzięki za odpowiedzi. Niezaprzeczalnym plusem rozwiązania mmmmmmm jest podanie go na tacy smile.gif. Lepsza wydajność rozwiązania nospor wydaje się jednak być ważniejsza. Ma jednak faktycznie taki minus, że muszę je sam zapisać. Jest to minus, jak na razie dla mnie, nieprzeskakiwalny sad.gif. Jeszcze przez jakiś czas mogę pozostać przy starym rozwiązaniu w PHP. Z dużej tabeli pobieram sobie rekordy według pewnych kryteriów i dopiero ten wynik przetwarzam sobie kodem o takim schemacie:
  1. <?php
  2. $tablica = array('B', 'A', 'D', 'A', 'C', 'A', 'C', 'A', 'D', 'A', 'D', 'A');
  3.  
  4. foreach ($tablica as $wiersz) {
  5.  
  6. if ($wiersz == 'C') {
  7. $czy = 'yes';
  8. } else {
  9. if ($wiersz == 'A' && $czy == 'yes')
  10. echo $wiersz.'<br />';
  11. $czy = 'no';
  12. }
  13. }
  14. ?>

Jak dotąd ilość tych rekordów do przetworzenia jest niewielka więc wydajność takiego rozwiązania nie ma dla mnie większego znaczenia. Problem pojawi się gdy będę chciał rozszerzyć kryteria ich wyboru i znacznie wzrośnie ich ilość. Dlatego chciałem zdać te obliczenia na bazę danych. Niestety, poza podstawowymi poleceniami SQL niewiele z niego kojarzę wink.gif.
Go to the top of the page
+Quote Post
nospor
post
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




  1. SET @zmprev=NULL,@zm2=NULL;
  2. SELECT * FROM (SELECT T.*, @zmprev:=@zm2 AS zmprev, @zm2:=POLE FROM T) podsel WHERE podsel.POLE='A' AND (podsel.zmprev = 'B' || podsel.zmprev = 'C')


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
marekdominikowsk...
post
Post #11





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 16.11.2013

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


Bardzo Wam dziękuję. Oba rozwiązania bardzo mi pomogą..
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: 19.08.2025 - 16:08