Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: trudne zapytanie z count
Forum PHP.pl > Forum > Bazy danych > MySQL
pbanasiak
potrzebuje wyciągnąć w jednym zapytaniu z tabeli x te rekordy, gdzie x.ilosc > 1+ilość rekordów w tabeli y, gdzie y.username=x.username
popbart
Nikt tu nie jest jasnowidzem i nie wie jaka jest struktura bazy smile.gif
crash
  1. SELECT x.*
  2. FROM x, y WHERE x.ilosc > 1 + count(DISTINCT y.rekord) AND x.username = y.username

Może zadziała smile.gif
pbanasiak
crashu

MySQL zwrócił komunikat:

#1111 - Invalid use of group function



popbart - struktura nie ma znaczenia, ale jak chcesz to podaję
to jest tabela x
Kod
id  bigint(20)   Nie    auto_increment              
   url  text   Tak  NULL                
   username  varchar(20)   Tak  NULL                
   active  int(1)   Tak  NULL                
   approved  int(1)   Tak  NULL                
   odslon  bigint(20)   Tak  NULL                
   time  bigint(20)   Tak  NULL                
   admin  int(1)   Nie  0          

a to y
Kod
time  bigint(20)   Tak  NULL                
   username  varchar(20)
i jest jeszcze tabela z:
Kod
username  varchar(20)   Tak  NULL                
credit  decimal(20,1)   Tak  NULL


aktualnie zapytanie wyglada tak:

  1. SELECT `x`.`id`, `x`.`userid`, `x`.`url`, `z`.`credit`
  2. FROM `x`, `z` WHERE `x`.`userid` = `z`.`userid` && `x`.`admin` = 0 && `x`.`approved` = 1 && `x`.`active` = 1 && `z`.`credit` >= 1 && `x`.`userid` != $_SESSION[userid] ORDER BY `x`.`time`

i potem jest jeszcze
  1. SELECT count(*)
  2. FROM `y` WHERE `userid` = $rezul[userid]

i jeśli
  1. <?php
  2. if($rezul[&#092;"credit\"]-$ile < 1) break; //ile to ta wartość z drugiego zapytania
  3. ?>

i chodzi o to aby to połączyć w jedno
SongoQ
  1. COUNT(*) AS iloscrekordow, x.username, x.ilosc
  2. FROM x, y
  3. WHERE x.username = y.username
  4. GROUP BY x.username, x.ilosc
  5. HAVING x.ilosc > 1 + iloscrekordow
pbanasiak
a mógłby ktoś pomóc dodać to do tego
  1. SELECT `x`.`id`, `x`.`userid`, `x`.`url`, `z`.`credit`
  2. FROM `x`, `z` WHERE `x`.`userid` = `z`.`userid` && `x`.`admin` = 0 && `x`.`approved` = 1 && `x`.`active` = 1 && `z`.`credit` >= 1 && `x`.`userid` != $_SESSION[userid] ORDER BY `x`.`time`

aby tam gdzie jest `z`.`credit` >= 1 była dodana ilość rekrordów z y, gdzie y.userid=x.userid
SongoQ
Co do zapisu SQLa to zamiast AND pisanie && jest niepoprawnym zapisem, jest to glupi wymysl MySQLa niezgodny z innymi bazami danych. Polecam stosowanie AND, OR zamast &&, ||

A co do zapytania to CI juz pisalem uzyj Count i having.

Powyzej masz przyklad, tylko gdzies mi slowo select wcialo.
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.