Avatar billede kbhadsten Nybegynder
17. februar 2005 - 18:44 Der er 14 kommentarer og
1 løsning

Begynder MySQL spørgsmål, lave count i tabel1 med ref. til tabel2

Hey Eksperten.dk

Jeg har lavet nedenstående kode som egentligt virker fint nok, men da jeg gerne vil igang med at lave optimering og lære om det, så ville jeg høre jer hvordan man trækker nedenstående sammen i én SQL sætning da det må være hurtigere for Serveren at bearbejde.

$q = mysql_query("SELECT * FROM lan_news ORDER BY Id DESC LIMIT 10");
while ($data = mysql_fetch_array($q))
  {
  $q2 = mysql_query("SELECT Id FROM lan_news_comments WHERE news_id = '".$data['Id']."'");

// mere kode, men den er ikke nødvendig for at forstå problemet.
Avatar billede arne_v Ekspert
17. februar 2005 - 18:46 #1
SELECT *
FROM lan_news,lan_news_comments
WHERE lan_news.id=lan_news_comments.news_id
Avatar billede arne_v Ekspert
17. februar 2005 - 18:47 #2
Avatar billede kbhadsten Nybegynder
17. februar 2005 - 18:51 #3
hmm, ja og nej! den er ikke helt god nok for jeg skal jo ikke bruge alle data i lan_news_comments, så hvorfor skulle jeg bede serveren om at indlæse dem, det må da bare tage flere ressourcer end godt er.
Avatar billede arne_v Ekspert
17. februar 2005 - 18:55 #4
SELECT *
FROM lan_news,lan_news_comments
WHERE lan_news.id=lan_news_comments.news_id
ORDER BY lan_news.id DESC LIMIT 10"
Avatar billede kbhadsten Nybegynder
17. februar 2005 - 18:55 #5
glemte da faktisk lige en linie som måske ændre svarene lidt. $antal = mysql_num_rows($q2); til sidst :D
Avatar billede arne_v Ekspert
17. februar 2005 - 18:57 #6
Hmm 18:55:02 gør faktisk ikke helt det samme som dine 2 queries
Avatar billede arne_v Ekspert
17. februar 2005 - 19:00 #7
Hvis du er på MySQL 4.1 kan du:

SELECT id FROM lan_news_comments WHERE news_id IN
(SELECT id FROM lan_news ORDER BY Id DESC LIMIT 10)

Men på ældre MySQL versioner er det nok tricky.
Avatar billede arne_v Ekspert
17. februar 2005 - 19:00 #8
Hvis du kun skal bruge antallet og ikke id'erne kan du bruge

SELECT COUNT(*) FROM ...
Avatar billede kbhadsten Nybegynder
17. februar 2005 - 19:00 #9
hmmm, at forklare: Jeg har lan_news som hentes frem. Til hver af de ti nyheder i $q skal jeg have fundet ud af antal kommentarer der er til den nyhed $q2. alle kommentarer ligger i lan_news_comments og derfor skal jeg ikke bruge andet en f.eks. Id fra lan_news_comments så jeg kan lave en mysql_num_rows().... gav det mere mening!
Avatar billede arne_v Ekspert
17. februar 2005 - 19:02 #10
Ah.

Stadig forudsat 4.1:

SELECT id,COUNT(*) FROM lan_news_comments WHERE news_id IN
(SELECT id FROM lan_news ORDER BY Id DESC LIMIT 10)
GROUP BY id
Avatar billede kbhadsten Nybegynder
17. februar 2005 - 19:04 #11
har prøvet med den her, men det virker ikke rigtigt
SELECT n.*, COUNT(c.Id) AS antal FROM lan_news n, lan_news_comments c WHERE n.Id = c.news_id GROUP BY n.Id ORDER BY n.Id DESC LIMIT 10
Avatar billede kbhadsten Nybegynder
17. februar 2005 - 19:46 #12
hmm, det virker da lige mere nu, jeg havde installeret en 4.00 Alpha, ikke skide fedt, men nu med 4.1.10 melder den da ikke fejl :D

bare stadig ikke det rigtige
Avatar billede arne_v Ekspert
17. februar 2005 - 21:33 #13
Kan du uddybe lidt hvad der er forkert ?
Avatar billede kbhadsten Nybegynder
18. februar 2005 - 08:53 #14
Ja det kan jeg da.

Jeg skal have SQL sætningen til at hente de seneste 10 nyheder fra lan_news og for hver nyhed skal den gennemse hele lan_news_comments for kommentarer til denne nyhed som den så skal tælle op.

Da jeg ikke lige har adgang til mig pc i skrivende stund bliver det lidt på slum. Men det jeg husker den gjorde galt var at selvom der var 2 kommentarer i lan_news_comments så viste feltet "antal" stadig kun én hvilket jo var forkert.

SELECT n.*, COUNT(c.Id) AS antal FROM lan_news n, lan_news_comments c WHERE n.Id = c.news_id GROUP BY n.Id ORDER BY n.Id DESC LIMIT 10
Avatar billede kbhadsten Nybegynder
07. marts 2005 - 15:38 #15
lukkes, fejlen lå i MySQL serverens måde at hashe passwords
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