Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Sąsiadujące wiersze w tabeli bazy danych, Jak efektywnie wyciągnąć?
djlinux
post
Post #1





Grupa: Zarejestrowani
Postów: 12
Pomógł: 2
Dołączył: 4.07.2009
Skąd: Zamość

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


Witam
Posłużę się przykładem, posiadam taką tabelkę:
  1. mysql> SELECT * FROM photos;
  2. +----+---------+----------+
  3. | id | content | sequence |
  4. +----+---------+----------+
  5. | 1 | #1 | 1 |
  6. | 2 | #2 | 4 |
  7. | 3 | #3 | 7 |
  8. | 4 | #4 | 11 |
  9. | 5 | #5 | 32 |
  10. +----+---------+----------+
  11. 5 rows IN SET (0.00 sec)

Za cel stawiam sobie odczytanie sąsiednich wierszy (sąsiednich względem wartości pola sequence) powiedzmy dla id=3 (oczywiście przy założeniu, że id mogą być "nie po kolei").

Chciałbym poprosić o sprawdzenie, a może podpowiedzenie innego efektywniejszego sposobu na osiągnięcie mojego celu. Mój dotychczasowy rezultat:
  1. mysql> (SELECT * FROM photos WHERE sequence < (SELECT sequence FROM photos WHERE id=3) ORDER BY sequence DESC LIMIT 1) UNION
  2. -> (SELECT * FROM photos WHERE sequence > (SELECT sequence FROM photos WHERE id=3) ORDER BY sequence ASC LIMIT 1);
  3. +----+---------+----------+
  4. | id | content | sequence |
  5. +----+---------+----------+
  6. | 2 | #2 | 4 |
  7. | 4 | #4 | 11 |
  8. +----+---------+----------+
  9. 2 rows IN SET (0.00 sec)


Struktura tabeli w razie potrzeby, stworzona tylko w celu przetestowania idei opisanej wyżej.
  1. mysql> SHOW CREATE TABLE PHOTOS;
  2. +--------+-------------------------------------------------
  3. | TABLE | CREATE TABLE
  4. +--------+-------------------------------------------------
  5. | PHOTOS | CREATE TABLE `photos` (
  6. `id` int(11) NOT NULL AUTO_INCREMENT,
  7. `content` varchar(20) NOT NULL,
  8. `sequence` int(11) NOT NULL,
  9. PRIMARY KEY (`id`)
  10. ) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1 |
  11. +--------+-------------------------------------------------
  12. 1 row IN SET (0.00 sec)


Ten post edytował djlinux 9.08.2010, 09:42:38
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Zasadnicze pytanie... czy sequence ma szansę zostać odwrócone wzgledem kolejności id? Może prościej... czy może zajść sytuacja, że rekord o mniejszym id od wybranego ma wyższą sequence lub rekord o wyższym id ma ją niższą? Jeśli nie to nie ma sensu walić podzapytania tylko od razu wziąć WHERE id < 3 w pierwszym członie i WHERE id > 3 w drugim członie UNIONa smile.gif Redukujesz wtedy podzapytanie niepotrzebne, które i tak jest bez znaczenia wtedy. Zresztą sam zobacz czy wyniki tego
  1. (SELECT * FROM photos WHERE id<3 ORDER BY id DESC LIMIT 1)
  2. UNION
  3. (SELECT * FROM photos WHERE id>3 ORDER BY id ASC LIMIT 1);
są identyczne. W razie czego zamiast ORDER BY id daj ORDER by sequence i porównaj wyniki.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
djlinux
post
Post #3





Grupa: Zarejestrowani
Postów: 12
Pomógł: 2
Dołączył: 4.07.2009
Skąd: Zamość

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


Ma szanse, dzięki polu 'sequence' użytkownik będzie mógł w panelu administracyjnym zmieniać kolejność zdjęcia, stąd też nie mogę się opierać na polu ID.
Tak jak wspomniałem to wyżej to tylko sama idea, którą planuje wykorzystać przy pisaniu aplikacji i projektowaniu bazy danych.
Interesuje mnie natomiast wydajność czegoś takiego, możliwe, że zapytanie takiego typu będzie dość często wykonywane (przy kliknięciu na strzałkę w prawo / w lewo, przy takim pasku z miniaturkami zdjęć , gdzie są poprzednie, następne zdjęcia, ew. typowy paginator z cyferkami). W tabeli planuje jeszcze kilka innych pól jak opis zdjęcia w języku polskim, angielskim, data, tytuł i być może jakieś pole trzymające id przynależności do kategorii zdjęć (zastanawiam się bardziej nad trzymaniem id zdjęć w tabeli z dana kategorią i wciąganiem wszystkiego za pomocą join'a)
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 - 13:24