Kom ihåg mig?
Home Menu

Menu


klurig mySQL fråga (php)

 
Ämnesverktyg Visningsalternativ
Oläst 2009-12-04, 08:29 #11
youheardit youheardit är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Oct 2008
Inlägg: 1 168
youheardit youheardit är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Oct 2008
Inlägg: 1 168
Magnus_A: Tack så mycket, detta var klockrent!

Obe: Som bjorne säger så är ju det problemet att alla artiklar (43955st) som inte har kommentar skrivs också ut. vilket jag inte vill, jag var nog lite otydlig i min första tråd, ber om ursäkt isåfall. men tack ändå
youheardit är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-12-04, 10:45 #12
obes avatar
obe obe är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 172
obe obe är inte uppkopplad
Medlem
obes avatar
 
Reg.datum: Dec 2004
Inlägg: 172
Citat:
Ursprungligen postat av Bjorne Visa inlägg
Ditt sätt är dock felaktigt. Tänk på vad som händer ifall en artikel har 0 kommentarer.
Ok, men en WHERE-sats är ju inte så svårt att lägga till. Generellt sett är joins bättre än subquerys.

Senast redigerad av obe den 2009-12-04 klockan 10:53
obe är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-12-04, 11:34 #13
Bjorne Bjorne är inte uppkopplad
Flitig postare
 
Reg.datum: Sep 2009
Inlägg: 374
Bjorne Bjorne är inte uppkopplad
Flitig postare
 
Reg.datum: Sep 2009
Inlägg: 374
Det hjälper inte med en WHERE sats, trust me. Med LEFT JOIN:en kommer 1 rad för varje artikel att väljas för alla artiklar som har 0 eller 1 kommentar. Alltså kommer COUNT(*) ge 1 de fallen. Man kan lösa det genom att använda en INNER JOIN istället som gör att bara artiklar som har 1 eller flera kommetarer väljs. Men då listas ju inga artiklar med 0 kommentarer.
Bjorne är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-12-04, 11:53 #14
FredrikMHs avatar
FredrikMH FredrikMH är inte uppkopplad
Supermoderator
 
Reg.datum: Apr 2004
Inlägg: 1 501
FredrikMH FredrikMH är inte uppkopplad
Supermoderator
FredrikMHs avatar
 
Reg.datum: Apr 2004
Inlägg: 1 501
Bjorne, jo men det går att lösa. Fast det kanske är långsamt?

SELECT a.*, c.ncomments FROM artiklar a
LEFT JOIN (SELECT pid, count(*) AS ncomments FROM comments GROUP BY pid) AS c
ON c.pid=a.pid

Hur som helst så innebär en kombination av GROUP BY och ORDER BY att en temporär tabell skapas. Det bästa hade varit att spara antalet kommentarer i en egen kolumn i tabellen för artiklarna.
FredrikMH är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-12-04, 12:06 #15
obes avatar
obe obe är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 172
obe obe är inte uppkopplad
Medlem
obes avatar
 
Reg.datum: Dec 2004
Inlägg: 172
Citat:
Ursprungligen postat av Bjorne Visa inlägg
Det hjälper inte med en WHERE sats, trust me. Med LEFT JOIN:en kommer 1 rad för varje artikel att väljas för alla artiklar som har 0 eller 1 kommentar. Alltså kommer COUNT(*) ge 1 de fallen. Man kan lösa det genom att använda en INNER JOIN istället som gör att bara artiklar som har 1 eller flera kommetarer väljs. Men då listas ju inga artiklar med 0 kommentarer.
Ok, jag var tvungen att prova den och den fungerar. Du missade nog "GROUP BY".
obe är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-12-04, 21:57 #16
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Citat:
select count(kommentartabellen.postid) as antal_kommentarer,
kommentartabellen.postid,
en_annan_tabell.annat_fält
from kommentartabellen, en_annan_tabell
where kommentartabellen.postid=en_annan_tabell.postid
group by kommentartabellen.postid
order by antal_kommentarer desc limit [antal i topplistan]
Bättre så?
Magnus_A är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-12-05, 05:54 #17
FredrikMHs avatar
FredrikMH FredrikMH är inte uppkopplad
Supermoderator
 
Reg.datum: Apr 2004
Inlägg: 1 501
FredrikMH FredrikMH är inte uppkopplad
Supermoderator
FredrikMHs avatar
 
Reg.datum: Apr 2004
Inlägg: 1 501
Den bästa lösningen är ändå att köra en seperat kolumn i artikel-tabellen och räkna antalet kommentarer där. Blir ju en extra SQL-fråga vid in/borttagning av kommentar men slipper köra en GROUP BY/ORDER BY.
FredrikMH är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-12-05, 15:59 #18
Bjorne Bjorne är inte uppkopplad
Flitig postare
 
Reg.datum: Sep 2009
Inlägg: 374
Bjorne Bjorne är inte uppkopplad
Flitig postare
 
Reg.datum: Sep 2009
Inlägg: 374
Citat:
Ursprungligen postat av FredrikMH Visa inlägg
Bjorne, jo men det går att lösa. Fast det kanske är långsamt?

SELECT a.*, c.ncomments FROM artiklar a
LEFT JOIN (SELECT pid, count(*) AS ncomments FROM comments GROUP BY pid) AS c
ON c.pid=a.pid

Hur som helst så innebär en kombination av GROUP BY och ORDER BY att en temporär tabell skapas. Det bästa hade varit att spara antalet kommentarer i en egen kolumn i tabellen för artiklarna.
Jo fast om man ska vara petnoga (vilket jag tycker man ska vara när det gäller sql) ska det vara:

SELECT a.*, COALESCE(c.ncomments, 0) FROM ...

Annars får du NULL istället för 0 ifall en artikel inte har några kommentarer. Men sen specificierade ju youheardit att topplistan aldrig ska innehålla artiklar med 0 kommentarer och då är ju obes ursprungliga version effektivast igen.
Bjorne är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 11:56.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017