Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sąsiadujące wiersze w tabeli bazy danych
Forum PHP.pl > Forum > Bazy danych > MySQL
djlinux
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)
thek
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.
djlinux
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)
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.