Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Znajdż, oblicz i podaj wynik. Można tak zrobić?
Forum PHP.pl > Forum > Bazy danych > MySQL
xeo
Mam taką baze danych:

_wartosc____data_____czas_____dzien
____1____2005-01-02__2:00__poniedziałek
____5____2005-01-02__3:00__poniedziałek
____4____2005-01-02__4:00__poniedziałek
____1____2005-01-03__2:00__wtorek
____3____2005-01-03__3:00__wtorek

czy jest możliwość zastosować tylko SELECT oczywiście z FORM WHERE itp. żeby mi znalazło w wszystkie poniedziałki czy wartość o godzinie przykładowo 2:00 była wieksza od wartości tego dnia o godzinie 3:00 i tak żeby sprawdziło każdy poniedziałek w bazie i zapisało wynik do zmiennej $wynik, na przykład było 45 poniedziałków w których wartość o 2:00 była wieksza od wartosci o 3:00? I jescze jedna prośba jeżeli ktoś ma strone gdzie są wytłumaczone wszystkie możliwości SELECT chodzi mi o MAX MIN COUNT itp. to podajcie.
Dzięki
Pozdrawiam
Aztech
Primo: pisz całymi zdaniami bo tego się czytać nie da, pisz dokładniej!
Secundo: to wszystko jest wytłumaczone w MANUALU!
Tertio: zrobiłeś coś, napisałeś coś, czy czekasz aż ci podają na tacy?
xeo
Cytat(Aztech @ 2005-11-21 19:15:19)
Tertio: zrobiłeś coś, napisałeś coś, czy czekasz aż ci podają na tacy?

A dlaczego by nie!!!!! Przecież po to są fora dyskusyjne żeby naprowadzić lub podać rozwiązanie, przecież logiczne jest że jak bym znał rozwiązania to bym nie pisał ten post.
Jest baza są kolumny wartosc, data, czas, dzien i chcę wyszukać ile było poniedzialków w których wynik w kolumny wartosc o 2:00 był wiekszy niż o 3:00 Nie wiem jeszcze w jaki sposób można to wytłumaczyć, myślę że nawet pierwsze tłumaczenie było czytelne.


Podam na dokładnym przykładzie, jeżeli cała baza wygląda tak:

_wartosc____data_____czas_____dzien
____9____2005-01-02__2:00__poniedziałek
____5____2005-01-02__3:00__poniedziałek
____4____2005-01-02__4:00__poniedziałek
____1____2005-01-03__2:00__wtorek
____3____2005-01-03__3:00__wtorek
____9____2005-01-06__2:00__poniedziałek
____1____2005-01-06__3:00__poniedziałek
____4____2005-01-06__4:00__poniedziałek
____1____2005-01-08__2:00__środa
____5____2005-01-08__3:00__środa
____4____2005-01-08__4:00__środa
____1____2005-01-11__2:00__poniedziałek
____6____2005-01-11__3:00__poniedziałek
____4____2005-01-11__4:00__poniedziałek

2005-01-02 to poniedziałek i wartość o 2:00 jest 9 więc jest większa od wartości o 3:00 która jest 5, 2005-01-06 wartość o 2:00 jest 9 więc jest większa od wartości o 3:00 która jest 1 , 2005-01-11 wartośc o 2:00 jest 1 więc jest mniejsza od wartości o 3:00 która jest 6. Wychodzi na to że mamy trzy poniedziałki w których dwa razy wartość o 2:00 była wieksza od wartości o 3:00 i raz gdzie wartość o 2:00 była mniejsza o 3:00, interesuja mnie tylko ile razy wartość była wieksza o 2:00 niż o 3:00 więc wynik który powinienem uzyskać to 2. Ja pobieram z bazy wszystkie poniedziałki które mają czas 2:00 i 3:00 i na zewnątrz to wszystko analizuje ale niestety to trwa bardzo długo i chcę to zrobić w samą baze danych ale nie wiem czy jest to możliwe.
Aztech
Primo: Tak po to są fora aby zadawać pytania, ale warto pokazać, że coś już zrobiłeś!
Secundo: logiczne jest, że wyjaśnienie SELECT znajduje się w manualu
Tertio: Oto rozwiązanie:
Założyłem tabelę testową o strukturze takiej jak Twoja tylko dodałem pole ID, które jest kluczem prymalnym a wiec wyglada to tak:

ID | WARTOSC | DATA | TIME | DZIEN

UWAGA: pole TIME ma następujący wygląd zgodny z formatem TIME: hh:mm:ss

Należy złączyć tabelę z sobą samą więc raz ją nazywasz jako td1 a za drugim razem jako td2 (patrz: LEFT JOIN) potem masz polecenie ON, czyli względem czego złączyłeś, tutaj najważniejsza jest dala, bo chcesz porównywać ten jeden konkretnydzień.
Godzina ma byc druga więc: td1.czas = '02:00:00' analogicznie dla td2.czas = '03:00:00' no i wartosc w td1 (tam gdzie jest godzina 2) ma byc wieksza niz w td2 (tam gdzie jest godzina 3) więc logiczny warunek: td1.wartosc > td2.wartosc

Opcjonalnie możesz dodać warunek GROPU BY td1.ID gdyby okazało się że masz więcej niż jeden wpis z danej godziny.

Mam nadizeję, że to jest wystarczająco jasne

  1. SELECT td1.id, td1.wartosc, td1.DATA, td1.czas, td1.dzien, td2.id, td2.wartosc, td2.DATA, td2.czas, td2.dzien
  2. FROM testowa AS td1
  3. LEFT JOIN testowa AS td2 ON td1.DATA = td2.DATA
  4. WHERE td1.wartosc > td2.wartosc AND td1.czas = '02:00:00' AND td2.czas = '03:00:00'
  5. GROUP BY td1.id
xeo
Pole ID mam po prostu go nie podałem. Wielkie dzięki za rozwiązanie no i oczywiście za link z manualem. smile.gif
Pozdrawiam
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.