Avatar billede martinfrost Nybegynder
19. marts 2005 - 14:31 Der er 19 kommentarer og
1 løsning

Måske en subquery

Hej eksperter!

Jeg vil gerne have følgende kode:

$res = mysql_query("Select ID,Username,Date from t1 Where SID = '" $myVar . "'");

while( $row = mysql_fetch_array($res) ){

  $antal = mysql_result( Select count(ID) from t1 Where SID = '" . $row["ID"] . "'");

}

omskrevet til én query, således at jeg kan sortere efter count(ID).

Det skal forståes således:

- Jeg henter en masse ID'er ud af db'en ud fra et SID.
- For hvert fundet ID's eget SID finder jeg et antal nye ID'er.

Jeg vil nu gerne kunne sortere efter dette antal.

Håber I forstår og kan hjælpe :-)

/Martin
Avatar billede arne_v Ekspert
19. marts 2005 - 14:58 #1
Prøv:

SELECT t1a.id,t1a.username,COUNT(*)
FROM t1 t1a,t1 t1b
WHERE t1a.id=t1b.sid
Avatar billede martinfrost Nybegynder
20. marts 2005 - 13:38 #2
Jeg vil blive glad, hvis du kunne udbybe dit svar lidt... f.eks. forstår jeg ikke helt, hvor $myVar bliver af?! :)
Avatar billede arne_v Ekspert
20. marts 2005 - 13:42 #3
$sqlstr = "SELECT t1a.id,t1a.username,COUNT(*) FROM t1 t1a,t1 t1b WHERE t1a.id=t1b.sid AND t1a.sid='$myvar'";
Avatar billede martinfrost Nybegynder
20. marts 2005 - 13:51 #4
Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause

siger den...
Avatar billede arne_v Ekspert
20. marts 2005 - 13:53 #5
$sqlstr = "SELECT t1a.id,t1a.username,COUNT(*) FROM t1 t1a,t1 t1b WHERE t1a.id=t1b.sid AND t1a.sid='$myvar' GROUP BY t1a.id";
Avatar billede martinfrost Nybegynder
20. marts 2005 - 13:57 #6
Yup, jeg tror fanme det virker! :D 1000 tak!! Herligt!

Du kan bare ligge et svar, hvis du gerne vil have pointene :-) Det har du vist mere end så rigeligt fortjent!
Avatar billede arne_v Ekspert
20. marts 2005 - 13:59 #7
kommer her
Avatar billede martinfrost Nybegynder
20. marts 2005 - 14:01 #8
Endnu engang tak!
Avatar billede martinfrost Nybegynder
20. marts 2005 - 14:12 #9
Ohh, en lille overset ting...

Jeg vil også gerne have ID og Username på dem, hvor count() = 0.
Avatar billede martinfrost Nybegynder
20. marts 2005 - 14:47 #10
Jeg håber, at du stadig abonnerer på tråden her, Arne?!
Avatar billede arne_v Ekspert
20. marts 2005 - 14:58 #11
Prøv:

$sqlstr = "SELECT t1a.id,t1a.username,COUNT(*) AS n FROM t1 t1a,t1 t1b WHERE t1a.id=t1b.sid AND t1a.sid='$myvar' GROUP BY t1a.id HAVING n = 0";

eller

$sqlstr = "SELECT t1a.id,t1a.username,COUNT(*) AS n FROM t1 t1a,t1 t1b WHERE t1a.id=t1b.sid AND t1a.sid='$myvar' GROUP BY t1a.id HAVING COUNT(*) = 0";
Avatar billede martinfrost Nybegynder
20. marts 2005 - 15:13 #12
Begge dele "virker", men ingen af delene giver mig nogle resultater.
mysql_num_rows() returnerer 0. Hvis jeg derimod vælger n >= 0, så får jeg de samme som før.
Avatar billede arne_v Ekspert
20. marts 2005 - 15:17 #13
Så prøv:

$sqlstr = "SELECT t1a.id,t1a.username FROM t1 t1a LEFT JOIN t1 t1b ON t1a.id=t1b.sid AND t1b.sid IS NULL";
Avatar billede martinfrost Nybegynder
20. marts 2005 - 15:37 #14
Det giver mig det rigtige antal, men ID, username er forkert ved alle dem, hvor "count = 0". Således er ID,username blot en kopi af det sidste ID,username hvor count > 0.

JEg tænker lidt på, om man måske kunne bruge den forrige query sammen med en UNION (og så alle dem, hvor count = 0) .. ?!
Avatar billede martinfrost Nybegynder
20. marts 2005 - 15:41 #15
Nej, ved du hvad... nu kører det sq NÆSTEN!... eneste problem er at count = 1 ved folk, hvor den skulle være 0.
Avatar billede martinfrost Nybegynder
20. marts 2005 - 15:50 #16
Her har du den aktuelle sqlstr, hvor eneste fejl er at count = 1 for dem, hvor count skulle være nul:

Select t1a.ID, t1a.Username, count(*) as n From t1 t1a Left Join t1 t1b On t1a.ID = t1b.SID Or t1b.SID IS NULL Where c1.Sponsor = '$myVar' Group By t1a.ID Order By n Desc
Avatar billede martinfrost Nybegynder
20. marts 2005 - 15:52 #17
Sorry, der var lige en copy/paste fejl. Her er den:

Select t1a.ID, t1a.Username, count(*) as n From t1 t1a Left Join t1 t1b On t1a.ID = t1b.SID Or t1b.SID IS NULL Where t1b.SID = '$myVar' Group By t1a.ID Order By n Desc
Avatar billede martinfrost Nybegynder
20. marts 2005 - 15:53 #18
Stadig fejl, beklager... Nu må den være der:

Select t1a.ID, t1a.Username, count(*) as n From t1 t1a Left Join t1 t1b On t1a.ID = t1b.SID Or t1b.SID IS NULL Where t1a.SID = '$myVar' Group By t1a.ID Order By n Desc
Avatar billede arne_v Ekspert
20. marts 2005 - 18:25 #19
Jeg forstår ikke "Or t1b.SID IS NULL" ...
Avatar billede martinfrost Nybegynder
22. marts 2005 - 18:50 #20
Det bliver nødt til at være OR... Hvis du skriver AND, så spørger du jo om t1b.SID er lig med BÅDE t1a.ID og NULL, hvilket jo aldrig vil opfyldes...

Jeg counter nu på t1b.ID i stedet for *, og nu virker det hele :D
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester