Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak to pobrac wartosc maksymalna?
Forum PHP.pl > Forum > Bazy danych > MySQL
Baki
witam

mam zapytanie ktore z bazy statystyk zlicza ilosc wizy w danymi miesiacu..
chcialbym w jednym zapytaniu zarowno pobrac wartosci dla poszczeglonych miesiecy
jak rowniez makxymalna wartosc ale nie wiem czemu nie moge zrobic funckji MAX dla wczesniej count'owanej kolumny ?

tabela:
STATS
id|datetime|adres_ip

zapytanie wyglada obecnie tak:
  1. SELECT count(id) AS visit_count, MAX(visit_count) AS visit_count_max, DATE_FORMAT(datetime, '%Y') AS visit_year, DATE_FORMAT(datetime, '%c') AS visit_month
  2. FROM stats
  3. WHERE DATA LIKE '2006-%' GROUP BY visit_year, visit_month ORDER BY visit_year, visit_month


niestety dostaje komunikat:
Unknown column 'visit_count_max' in 'field list'


rowniez nie wiem czemu nie mozna robic warunku WHERE dla nazwanej przeze mnie kolumny.. Mysql na to nie pozwala czy cos zle robie?
  1. SELECT count(id) AS visit_count, DATE_FORMAT(DATA, '%Y') AS visit_year, DATE_FORMAT(datetime, '%c') AS visit_month
  2. FROM stats
  3. WHERE visit_year='2006' GROUP BY visit_year, visit_month ORDER BY visit_year, visit_month

dostaje komunikat: Unknown column 'visit_year' in 'where clause'




ogromna prosba o pomoc.. bo troche mnie zaczyna denerwowac albo ograniczonosc MySql'a albo moich umiejetnosci smile.gif


pozdrawiam
Aztech
Jeśli używasz count z tego co pamiętam warunki musza znajdować się nie w WHERE ale w HAVING: manual
nospor
@Aztech
Cytat
Jeśli używasz count z tego co pamiętam warunki musza znajdować się nie w WHERE ale w HAVING:
I tak, i nie. to zalezy jakie warunki. Jesli chcemy dac warunek na to, co wyliczamy w wyniku grupowania, to trzeba dac w having. Jesli jednak warunkujemy zwykle pole, to ma byc w where, jak do tej pory.

@Baki Mysql ma pewien bobol, ktory mi sie bardzo nie podoba. A mianowicie, gdy formatujesz pewne pole i robisz z niego alias, to niestety ten alias nie jest widoczny w where. Trzeba jeszcze raz w where formatowac:
  1. SELECT count(id) AS visit_count, DATE_FORMAT(DATA, '%Y') AS visit_year, DATE_FORMAT(datetime, '%c') AS visit_month
  2. FROM stats
  3. WHERE DATE_FORMAT(DATA, '%Y')='2006' GROUP BY visit_year, visit_month ORDER BY visit_year, visit_month


Odnosnie pierwszego zapytania.
Jestes pewien ze podales na dobry komunikat bledu?
"Unknown column 'visit_count_max' in 'field list'"
powinno raczej byc:
"Unknown column 'visit_count' in 'field list'"

Nie mozesz robic MAX(visit_count), gdyz visit_count powstaje w wyniku agregacji danych. A nie mozna z tego robic max. Max mozesz robic bezposrednio na polach. Czyli ty bys musial dac max(id). zwroci ci to max id dla danego grupowania.
Co chciales dokladnie osiągnąc tym zapytaniem? Czego max chcesz pobrac? max liczbę wizyt ze wszystkich miesięcy? Jak tak, to posortuj po tym wyniku, i wowczas pierwszy (ostatni) rekord, bedzie zawieral max
Baki
Cytat(nospor @ 2006-03-29 08:13:46)
@Aztech
Cytat
Jeśli używasz count z tego co pamiętam warunki musza znajdować się nie w WHERE ale w HAVING:
I tak, i nie. to zalezy jakie warunki. Jesli chcemy dac warunek na to, co wyliczamy w wyniku grupowania, to trzeba dac w having. Jesli jednak warunkujemy zwykle pole, to ma byc w where, jak do tej pory.

@Baki Mysql ma pewien bobol, ktory mi sie bardzo nie podoba. A mianowicie, gdy formatujesz pewne pole i robisz z niego alias, to niestety ten alias nie jest widoczny w where. Trzeba jeszcze raz w where formatowac:
  1. SELECT count(id) AS visit_count, DATE_FORMAT(DATA, '%Y') AS visit_year, DATE_FORMAT(datetime, '%c') AS visit_month
  2.  
  3. FROM stats
  4.  
  5. WHERE DATE_FORMAT(DATA, '%Y')='2006' GROUP BY visit_year, visit_month ORDER BY visit_year, visit_month


Odnosnie pierwszego zapytania.
Jestes pewien ze podales na dobry komunikat bledu?
"Unknown column 'visit_count_max' in 'field list'"
powinno raczej byc:
"Unknown column 'visit_count' in 'field list'"

Nie mozesz robic MAX(visit_count), gdyz visit_count powstaje w wyniku agregacji danych. A nie mozna z tego robic max. Max mozesz robic bezposrednio na polach. Czyli ty bys musial dac max(id). zwroci ci to max id dla danego grupowania.
Co chciales dokladnie osiągnąc tym zapytaniem? Czego max chcesz pobrac? max liczbę wizyt ze wszystkich miesięcy? Jak tak, to posortuj po tym wyniku, i wowczas pierwszy (ostatni) rekord, bedzie zawieral max

Hi

@Aztech: Having tu nic nie da..

@nospor.. dzieki jesli chodzi o aliasy rzeczywiscie Twoje rozwiazanie dziala poprawnie.. i masz racje ze to trche dziwne zachowanie jesli chodzi o MySql'a ze trzeba jeszcze raz przeformatowac czas..

co do mojego zapytania o MAX'owanie wyniku..

rzeczywiscie zapyanie:
  1. SELECT count(id) AS visit_count, DATE_FORMAT(DATA, '%Y') AS visit_year, DATE_FORMAT(DATA, '%c') AS visit_month, MAX(visit_count) AS visit_count_max
  2. FROM stats
  3. WHERE DATE_FORMAT(DATA, '%Y')='2006' GROUP BY visit_year, visit_month ORDER BY visit_year, visit_month


daje blad: Unknown column 'visit_count' in 'field list'

a juz tlumacze co mialo na celu robienie MAX(visit_count) AS visit_count_max

w aliasie visit_count mysql zwraca mi zliczona wartosc odwiedzin dla danego miesiaca w roku (uzyskana dzieki grupowaniu) chcialem rowniez zeby to zapytanie zwracalo jednosczesnie najwieksza.maksymalna liczbe odwiedzin dla miesiaca ktory ich mial najwiecej.. tak bym mogl to potem wykorzystac do wyliczenia wielkosci wykresu.. ale z tego co sugerujsze ze jesli sie nie da robic MAX'a na agregowanych danych to obawiam sie ze albo bede musial zrobic kolejne zapytanie albo obliczyc MAX korzystajac z php

nieprawdaz?


pozdrawiam i dzieki za pomoc!
nospor
No raczej jednym zapytaniem tego nie pogodzisz.
Baki
Cytat(nospor @ 2006-03-29 09:47:53)
No raczej jednym zapytaniem tego nie pogodzisz.

Hi

to jakie mozna zrobic osobne zapytanie zeby pobrac maksymalna liczbe owiedzin dla dnia/miesiaca/roku przy strukturze tabeli jak wyzej ?


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.