Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Jak uprościć zapytanie?
qbal
post
Post #1





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 24.11.2006

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


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





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 20.04.2006
Skąd: Kraków/Lublin/Lubartów

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


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





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 24.11.2006

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


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





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 20.04.2006
Skąd: Kraków/Lublin/Lubartów

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


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





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 24.11.2006

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


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

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

 



RSS Aktualny czas: 3.10.2025 - 08:45