Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak uprościć zapytanie?
Forum PHP.pl > Forum > Bazy danych > MySQL
qbal
Witam,

mam pewein problem odnosie zapytania do bazy danych

oto tabelka:
  1. +-------------+---------+------+-----+---------+-------+
  2. | FIELD | Type | NULL | KEY | DEFAULT | Extra |
  3. +-------------+---------+------+-----+---------+-------+
  4. | id_obiekt | int(11) | NO | MUL | | |
  5. | wierzcholek | int(11) | NO | | | |
  6. | waga | int(11) | NO | | | |
  7. +-------------+---------+------+-----+---------+-------+


Tabelka reprezentije graf. Krawedz w grafie zapisuje jako (pierwszy punkt, drugi punkt, waga).
dla prszykladu mam taka sciezke: 1,6,7,12,4 i chce aby baza zwrocila mi wagi (ewentualnie ich sume) poszczegolnych krawedzi. Czy da sie skrocic jakos to zapytanie:
  1. SELECT waga FROM nastepniki WHERE (id_obiekt=1 AND wierzcholek=6) OR (id_obiekt=6 AND wierzcholek=7) OR (id_obiekt=7 AND wierzcholek=12) OR (id_obiekt=12 AND wierzcholek=4);


Jestem poczetkujacy w SQL. Uzywam MySQL 5. Prosze o podpowiedz
--
Kuba
frickle
A w czym będziesz tą bazę wykorzystywał? w php? Ja jakoś nie widzę możliwości uproszczenia tego zapytania jeżeli chcesz otrzymać odpowiedź bezpośrednio z bazy. ewentualnie jeżeli chcesz dostać sumę to zamiast select waga from, wpisujesz select SUM(waga) from i dostaniesz na wyjściu sumę wag.

Jeśli zapytanie będzie wykonywane spod jakiegokolwiek języka programowania, to chyba najlepiej byłoby sumować to na poziomie języka, czyli napisać funkcję która czyta wagi pomiędzy punktami, a potem ją wywoływać cyklicznie dla wszystkich par wierzchołków.
qbal
Baze wykorzystuje w php 5.

Glownie chodzi mi o to ze zapytanie w takiej frormie jak powyzej bede musial generowac dynamicznie (tzn przy pomocy jakiej petli), w zaleznosci od tego ile krawedzi bede mial.
Gdyby dalo sie uproscic to zapytanie aplikacja dzialalaby troszke szybciej:)

Co do sumownia wynikow: uczyli mnie na studiach (nie wiem czy to jest zgodne z praktyka:) ), ze operacje na danych typu sortowanie, zliczanie itp. lepiej zrzucic na baze. Powinna miec ona juz zoptymalizowane funkcje. Poza tym niweluje sie troche czasu na przypisanie danych z bazy do zmiennych w danym jezyku programowania i przetworzenie tych danych....
frickle
Obawiam się że nie bardzo jest jak uprościć. Musisz podać wszystkie pary wierzchołków bazie, bo inaczej bania. Jeśli chodzi o sumowanie to po prostu piszesz

  1. SELECT sum(waga) FROM TABELKA ... itd


i masz zwróconą sumę wag odpowiadających zapytaniu.

W tej sytuacji ja jednak wykonałbym ileśtam osobnych zapytań i zliczył te wagi programowo bo tworzenie zapytania w locie za pomocą pętli wydaje mi się tak samo skomplikowane albo nawet bardziej niż takie rozwiązanie.
qbal
Ja jednak pozostane przy tym zapytaniu. Juz napisalem odpowiednia funkcje ktora mi konstrułuje zapytanie i mysle ze tak bedzie ok.

Poza tym jak gdzies czytalem, aby efektywnie serwis dzialal zaleca sie wykonanie do 4 zapytan na strone... przy odzielnym zapytaniu o wage kazdej krawedzi tych zapytan wtykonalbym duzo.

Do komunikacji z bazy uzywam PDO i przy okazji zauwazylem ze nie jest mozliwe bindowanie dwa razy tej samej danej np:

  1. SELECT SUM(waga) FROM nastepniki WHERE (id_obiekt=:punkt0 AND wierzcholek=punkt1) OR (id_obiekt=:punkt1 AND wierzcholek=:punkt2);


trzeba kazda dana podpinac osobno, czyli:

  1. SELECT SUM(waga) FROM nastepniki WHERE (id_obiekt=:punkt0 AND wierzcholek=:punkt1) OR (id_obiekt=:punkt2 AND wierzcholek=:punkt3);



powyzsze zapytanie nie sprawdzalo sie jezeli jrawedzie sciezka zawierala powtarzajace sie krawedzie

Sprawdza sie zaytanie tego typu:

  1. SELECT TIME_FORMAT(SUM(waga),'%H:%i') aaa FROM ( SELECT waga FROM nastepniki WHERE id_obiekt=p1 AND wierzcholek=p2 UNION ALL
  2. SELECT waga FROM nastepniki WHERE id_obiekt=p2 AND wierzcholek=p3 UNION ALL
  3. ....
  4. SELECT waga FROM nastepniki WHERE id_obiekt=p(n) AND wierzcholek=p(n+1)
  5. ) AS waga;

To zapytanie dziala poprawnie

Tylko pojawil mi sie pewien problem: wage krawedzi mam podana w formie czasu (typ danej w bazie: time). Wszystko dziala ok dopoki np. minut nie bedzie wiecej niz 60. Bez TIME_FORMAT - dziala wporzadku. ale chcialbym zeby baza zwrocila mi wynik w postaci hh:mm. jak to zrobic??


powyzsze zapytanie nie sprawdzalo sie jezeli jrawedzie sciezka zawierala powtarzajace sie krawedzie

Sprawdza sie zaytanie tego typu:

  1. SELECT TIME_FORMAT(SUM(waga),'%H:%i') aaa FROM ( SELECT waga FROM nastepniki WHERE id_obiekt=p1 AND wierzcholek=p2 UNION ALL
  2. SELECT waga FROM nastepniki WHERE id_obiekt=p2 AND wierzcholek=p3 UNION ALL
  3. ....
  4. SELECT waga FROM nastepniki WHERE id_obiekt=p(n) AND wierzcholek=p(n+1)
  5. ) AS waga;

To zapytanie dziala poprawnie

Tylko pojawil mi sie pewien problem: wage krawedzi mam podana w formie czasu (typ danej w bazie: time). Wszystko dziala ok dopoki np. minut nie bedzie wiecej niz 60. Bez TIME_FORMAT - dziala wporzadku. ale chcialbym zeby baza zwrocila mi wynik w postaci hh:mm. jak to zrobic??
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.