Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: pobranie i porównanie wybranych rekordów
Forum PHP.pl > Forum > Bazy danych > MySQL
janek
to wycinek danych z mojej bazy:
  1. id | pytanie_id | DATA | godzina
  2. 1131 | 306 | 2005-07-12 | 16:27:28
  3. 1130 | 306 | 2005-07-12 | 15:29:58
  4. 1129 | 306 | 2005-07-12 | 15:22:16
  5. 1128 | 306 | 2005-07-12 | 15:17:21
  6. 1127 | 306 | 2005-07-12 | 15:16:46
  7. 1104 | 306 | 2005-07-12 | 11:24:44
  8. 1103 | 306 | 2005-07-12 | 11:24:11
  9. 1102 | 306 | 2005-07-12 | 11:06:26
  10. 1035 | 273 | 2005-07-11 | 14:45:19
  11. 989 | 273 | 2005-07-11 | 09:50:42
  12. 974 | 273 | 2005-07-09 | 09:53:05


widzicie tutaj informacje o pytaniach przesyłanych przez użytkowników mojej stronki. Ta tabela prezentuje odpowiedzi na te pytania, np. w pytaniu 306 kontakt z użytkownikiem pojawił się 8 razy (8 rekordów w bazie).

potrzebuje dowiedzieć się, jaki był czas odpowiedzi po wysłaniu pytania przez użytkownika. W pyt. 306 kontakt użytkonika rozpoczął się 12.07 o godz. 11:06:26. O 11:24:11 dostał odpowiedz. Potrzebuję obliczyć różnicę czasu między tymi rekordami. Czyli pozostałe 6 rekordów dla tego pytania mnie nie interesuje (ważna jest pierwsza odpowiedz na pytanie). Problem polega na tym, że takich pytań mam w bazie kilkaset i chcę to policzyć dla wszystkich.

Siedzę nad tym i przyznam, że nie mam pomysłu. Pewnie da się to jakoś zrobić przez podzapytania, ale w tym jestem słaby. Może ktoś ma pomysł?

z góry dzieki!
spenalzo
Baza jest troche źle zaprojektowana, najlepszym wyjsciem byloby trzymanie daty i czasu w jednym polu jako unix timestamp, co umowliziwa operacje na czasie i dacie przez zwykle operacje arytmetyczne.

W tym przypadku musiałbyś zapewne w zapytaniu złączyć date i czas w jedno pole (tymczasowe), potem rozbić to przy pomocy funkcji daty i czaus mysqla - albo pobrać dane do php i obliczenia wykonywać w php.

Pobierasz 2 rekordy, posortowane wg daty ASC, i czasu ASC z limitem 2, nastepnie w pierwszym zamieniasz date i czas na format unix timestamp, tak samo z drugim i odejmujesz.
SongoQ
Cytat
Baza jest troche źle zaprojektowana, najlepszym wyjsciem byloby trzymanie daty i czasu w jednym polu jako unix timestamp, co umowliziwa operacje na czasie i dacie przez zwykle operacje arytmetyczne.

Dokladnie o tym samym pomyslalem.

Ja bym to zrobil tak: laczysz 2 pola do postaci Timestamp i wyciagasz min i max dla timestatmpa o takim id jakie potrzebujesz (jesli szystkie to musisz pokombinowac z grupowaniem), Jesli bedziesz mial min i max to w nadrzednym zapytaniu zwracasz sobie roznice.
janek
dzięki za podpowiedzi!

problemem nie jest tyle porównanie czasu (z tym sobie poradzę bez problemu w php) tylko z wybraniem dwóch rekordów do porównania. zamiast pobierać wszystkie wpisy dla jedengo pytania, chcę pobrać tylko te dwa które potrzebuję. Chodzi o konkretne zapytanie, którym moge to zrealizować. To zapytanie ma pobierać po dwa rekordy dla wszystkich pytań jakie mam zarejestrowane od razu, tak żebym mógł sobie w php np. policzyć średnią itp.

Może ktoś ma pomysł, jak powinno wyglądać zapytanie?
spenalzo
Nie da sie raczej zrobić tego jednym zapytaniem - a nawet jeśli to byłoby to niepotrzebne cudowanie. Nalezy pamietac, ze czasami 100 zapytan jest szybciej obsluzonych niz 1 skomplikowane.

Zapytanie 1.
  1. SELECT *
  2. FROM tabela WHERE pytanie='id' ORDER BY DATA ASC, godzina ASC LIMIT 1

wrzucasz id do jakiejs zmiennej, np. $last_id
  1. SELECT *
  2. FROM tabela WHERE pytanie='id' AND id>'$last_id' ORDER BY DATA ASC, godzina ASC LIMIT 1


Oczywiście, przy załozeniu, ze pole id jest auto increment.
SongoQ
Cytat
Nie da sie raczej zrobić tego jednym zapytaniem - a nawet jeśli to byłoby to niepotrzebne cudowanie. Nalezy pamietac, ze czasami 100 zapytan jest szybciej obsluzonych niz 1 skomplikowane.

No nie do konca tak jest, zalezy jak do tego podejdziesz i ile czasu poswiecisz na jego dostrojenie i wtedy sie przekonasz co jest lepsze. Odnosnie tych petli to sa np funkcje, procedury ale to sie tyczy innych baz danych. Tak czy inaczej mozna na wiele sposobow kombinowac i roznie z tym bywa.

Mam taka mala uwage do tych Twoich zapytan.
Lepiej uzyc max i min bo jest wydajniejsze, wczoraj byl o tym post i kazdy byl za tym. Prosty przyklad

1. Dla pola bez indeksu
metoda z order by
- sortujesz (btree)
- operacja limit

metoda z max
- wybierasz najwieksza wartosc (chyba szukanie binarne)

Porownujac algorytmy 2 sposob jest szybszy.

Wariant 2 z indexem na pole data
metoda z order by
- wartosci posortowane
- operacja limit

metoda max
- odczytanie ostatniej wartosci

Tez 2 przyklad jest szybszy.

Jesli na dodatek zrobisz z tych zapytan 2 podzapytanie i dasz je jako zbior w FROM to powinienes otrzymac wynik szybciej niz pojedyncze 2 zapytania.

Wydaje mi sie ze nie walnolem nigdzie gafy jak by co to poprawcie mnie. smile.gif
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.