mysql - räkna hur många rader ..

Tråden skapades och har fått 14 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • Stockholm
  • 2003-03-10 15:41

Hej

Har en tabell där jag sparar nyheter och sen en annan tabell där jag sparar kommentarer som användare skriver.

Tabell news och tabell news_comments alltså.

När jag på första sidan hämtar nyheterna från news så vill jag även hämta hur många kommentarer den nyheten har.

Citat:

kod:<pre style="font-size:x-small; font-family: monospace;"> $query = "SELECT * FROM news ORDER BY timestamp DESC";
$nyheter = mysql_query($query) or die("misslyckades!");

while ($news = mysql_fetch_array($nyheter))
......
</pre>

Där inne i while-loopen så vill jag att för varje nyhet så ska den ansluta till till news_comments och räkna hur många rader det finns som hör till nyheten i fråga.
I tabellen news så är "news_id" primary
och i news_comments finns ett fält som heter "parent" som innehåller ett "news_id".

Nu är det så att jag inte riktigt får till det.

Citat:

kod:<pre style="font-size:x-small; font-family: monospace;"> $comments = mysql_query("SELECT COUNT(*) FROM news_comments WHERE parent = $news[´news_id´]");</pre>

Vet inte riktigt hur man gör.
Vore toppen om någon kunde skriva hur raden ska se ut för att få fram hur många comments det finns till ett news_id.

[ 10. mars 2003, 15:43: Meddelandet ändrat av: ivar ]

Så här kanske?

Citat:

kod:<pre style="font-size:x-small; font-family: monospace;">SELECT count(*) AS antal_kommentarer
FROM news_comments
WHERE parent = (valfritt värde)
GROUP BY parent;</pre>

  • Medlem
  • Stockholm
  • 2003-03-10 15:55

Humm

Jag hämtar nyheterna från news tabellen. För varje utskrift av EN nyhet från news så kommer den gå igenom news_comments och räkna hur många rader det finns där parent = $news[´news_id´].

Nu är jag lite ny på området, men GROUP BY parent när vi hämtar rader där alla har samma parent ... vad händer då egentligen??

Vad jag vill är att få variabeln $comments att få ett INT värde som motsvarar hur mångra rader som hittades där parent = $news[´news_id´].

  • Medlem
  • Stockholm
  • 2003-03-10 17:25

$comments = mysql_num_rows(mysql_query(" SELECT *
FROM news_comments
WHERE parent = $news[´news_id´]
"));

Ger mig

Parse error: parse error, expecting `T_STRING´ or `T_VARIABLE´ or `T_NUM_STRING´ in /home/e/enskede/www/ivar/optimus/news.php on line 68

Jag får inte ihop det här... hoppas någon har en lösning

[ 10. mars 2003, 17:26: Meddelandet ändrat av: ivar ]

  • Medlem
  • Stockholm
  • 2003-03-10 17:34
Citat:

kod:<pre style="font-size:x-small; font-family: monospace;">// Din kod
$comments = mysql_query(
"SELECT COUNT(*) FROM news_comments WHERE parent = $news[´news_id´]"
);

// Testa såhär istället:
$comments = mysql_query(
"SELECT COUNT(*) FROM news_comments WHERE parent = ´".$news[´news_id´]."´"
);</pre>

Tänk också på att du måste hämta ut värdet med en mysql_fetch_array() eller liknande precis som vanligt.

  • Medlem
  • Stockholm
  • 2003-03-10 17:47

Tack för hjälpen!

Allt löste sig dock när jag ändrade till

Citat:

kod:<pre style="font-size:x-small; font-family: monospace;">$id = $news[´news_id´];
$comments = mysql_num_rows(mysql_query(" SELECT * FROM news_comments WHERE parent = $id"));</pre>

[ 10. mars 2003, 17:49: Meddelandet ändrat av: ivar ]

  • Medlem
  • Stockholm
  • 2003-03-10 21:14

OK, men, som jag skrev i en liknande tråd nyligen, det är egentligen inte så bra att räkna poster på det sättet. Vad du gör är att hämta alla poster som matchar sökningen och därefter räkna dem, när du lika gärna kunde ha bett MySQL räkna dem direkt (SELECT COUNT(*)). Det senare går mycket snabbare och är mindre resurskrävande, särskilt om det rör sig om en stor databas.

Detta bör kunna ersätta din kod ovan:

Citat:

kod:<pre style="font-size:x-small; font-family: monospace;">$comments = mysql_query("SELECT COUNT(*) FROM news_comments WHERE parent = $id");
list($comments) = mysql_fetch_array($comments);
echo($comments); // visar antalet träffar</pre>

[ 10. mars 2003, 21:16: Meddelandet ändrat av: HL ]

  • Medlem
  • Stockholm
  • 2003-03-11 07:40

Okej!
Tack för hjälpen. Ska prova när jag kommer hem ikväll.

Vet inte riktigt vad list() gör, men ska kika på det också.
Ok, kommer säkert komma flera frågor då jag just nu är mitt i utvecklingen av flertalet tabeller och PHP-kodningar.

  • Medlem
  • Stockholm
  • 2003-03-11 09:02
Citat:

kod:<pre style="font-size:x-small; font-family: monospace;"> $newscount = mysql_result(mysql_query("select count(id) from news_comments where parent_id=´$id´"),0);
echo "$newscount";</pre>

  • Medlem
  • Stockholm
  • 2003-03-11 09:06
Citat:

citera:Skapades ursprungligen av: ivar:
Vet inte riktigt vad list() gör, men ska kika på det också.

List använder jag när jag drar grejor ur en databas. Lägger värdena till variabler.
Belysande exempel:

Citat:

kod:<pre style="font-size:x-small; font-family: monospace;">$newsposts = mysql_query("SELECT id,poster,headline,body FROM newsposts");
while(list($id,$poster,$headline,$body) = mysql_fetch_row($newsposts)) {
// do stuff
}</pre>

  • Medlem
  • Stockholm
  • 2003-03-11 09:28

php.net:

Citat:

citera:
list --  Assign variables as if they were an array

Like array(), this is not really a function, but a language construct. list() is used to assign a list of variables in one operation.

Not: list() only works on numerical arrays and assumes the numerical indices start at 0.

Exempel 1. list() examples

Citat:

kod:<pre style="font-size:x-small; font-family: monospace;"><?php

$info = array(´coffee´, ´brown´, ´caffeine´);

// Listing all the variables
list($drink, $color, $power) = $info;
print "$drink is $color and $power makes it special.
";

// Listing some of them
list($drink, , $power) = $info;
print "$drink has $power.
";

// Or let´s skip to only the third one
list( , , $power) = $info;
print "I need $power!
";

?></pre>

list() är härligt, eller hur?

Ändra sql-frågan till:

Citat:

kod:<pre style="font-size:x-small; font-family: monospace;">SELECT a.*, COUNT(b.parent) AS antal_kommentarer
FROM news a LEFT JOIN news_comments b
ON a.news_id = b.parent
GROUP BY a.news_id, a.timestamp, ... (alla kolumner i tabellen news)
ORDER BY timestamp DESC</pre>

På det här viset så har du antalen med i första resultatet och behöver inte göra fler slagningar.

[ 11. mars 2003, 13:06: Meddelandet ändrat av: Erik Lorentzson ]

  • Medlem
  • Stockholm
  • 2003-03-11 15:18

Tack för all hjälp!!

Erik Lorentzson, helt perfekt !
Satte mig och läste i min SQL-bibel och din query var ju klockren !! Har tenta på tisdag i "Modeller & Databaser" så det skadade verkligen inte att jag fick sätta mig och läsa lite

Fan vad bra det är att fråga om hjälp hos 99mac folket... bättre kunde det inte bli !

Lite onödigt då koden är i stort sett identiskmed Eriks inlägg, men jag postar ändå för den som undrar hur det tillslut såg ut.

Citat:

kod:<pre style="font-size:x-small; font-family: monospace;">$nyheter = mysql_query("
SELECT n.*, COUNT(c.parent) AS comments
FROM news n LEFT JOIN news_comments c
ON n.news_id = c.parent
GROUP BY n.news_id, n.timestamp, n.headline, n.name, n.message
ORDER BY timestamp DESC</pre>

Tack ännu en gång för hjälpen allihopa !!

[ 11. mars 2003, 15:19: Meddelandet ändrat av: ivar ]

  • Medlem
  • Stockholm
  • 2003-03-11 15:40

Fantastiskt! En medalj åt Erik!
Det här öppnar faktiskt lite nya möjligheter för en halvamatör som jag...

  • Medlem
  • Stockholm
  • 2003-03-11 15:46

Vi har pratat om JOIN i skolan och nämnde lite kort att det existerade LEFT JOIN, RIGHT JOIN och FULL JOIN men jag nöjde mig med att förstå JOIN. :rolleyes:

Verkligen, medalj åt erik !

[ 11. mars 2003, 15:47: Meddelandet ändrat av: ivar ]

1
Bevaka tråden