ugrás a tartalomhoz

MySQL: Adott hozzászólás beküldőjének összes hozzászólásának száma.

instantwater · 2010. Dec. 12. (V), 21.24
Sziasztok.
Van egy 'posts' táblám, amiből az alább látható lekérdezéssel kérem le az adatokat.
A 'posts' táblában eltároltam minden hozzászólás beküldőjének azonosítóját, és lekérdezéskor ezen azonosító alapján hozzáfűzöm a kimenethez a beküldő nicknevét.

Szeretném megoldani ugyanezen lekérdezésen belül, hogy a kilistázott posztok beküldőinek, ÖSSZESEN hány posztja van. Próbálkoztam a COUNT mindenféle elhelyezésével, és paraméterezésével, de legtöbbször az lett a vége, hogy kilistázta a beküldőket, és azt hogy összesen hány posztjuk van, de a posztokat nem.
Tehát én ehhez a poszt listázó, nicket is kiíró lekérdezéshez szeretném hozzáadni az adott beküldő ÖSSZES posztjának a számát, hogy ne kelljen újabb lekérdezést indítani PHP ból.

SELECT posts.*, users.nick AS nick
FROM `posts` 
RIGHT JOIN `users` ON posts.poster=users.id
WHERE `site` = 'c' OR `site` = '0' 
ORDER BY `date` DESC 
LIMIT 10;
Köszönettel:
InstantWater
 
1

mindenképpen legalább kettő kell

Poetro · 2010. Dec. 12. (V), 21.42
SELECT COUNT(`poster`) AS `posts`, `poster` FROM `posts`
WHERE `site` = 'c' OR `site` = '0' 
GROUP BY `poster`
Ezt azután persze cachelheted bárhol, és csak akkor üríted a cache-t, ha érkezik új hozzászólás
4

Működik, de nem ezt szeretném

instantwater · 2010. Dec. 12. (V), 23.27
Ez működik amit írtál, de én a postok kilistázásánál szeretném hozzácsapni az eredményhez új mezőként a posztok számát, és nem pedig egy külön lekérdezésben. Pontosan ez volt a topik megnyitásának apropója.
Cachelni. SQL egyik alapszabálya, hogy olyat nem tárolunk amit ki lehet számolni, bár ha végülis nem sikerül megoldani, akkor kénytelen leszek 2 külön lekérdezéssel megoldani.
Azért köszi
2

Subquery

janoszen · 2010. Dec. 12. (V), 22.22
Subqueryvel is megoldhatod, de ehelyett inkább vagy cacheld el, vagy a felhasználó profiljába mentsd el ezt az adatot. Ha ír egy hozzászólást, frissítheted a profilt.
3

Még egy JOIN?

neogee · 2010. Dec. 12. (V), 23.04
És ha ennek a lekérdezésnek az eredményét összejoinolod egy olyan lekérdezés eredményével ahol csak a userid-re és a postok számára kérdezel rá akkor mi történik? :)
5

Lehet...

instantwater · 2010. Dec. 12. (V), 23.31
Lehet, hogy működik, de ki tudnál segíteni egy mysql kóddal?
Ezek a joinok kezdenek összezavarni már.
Sima egytáblás lekérdezések mennek, de ez a többtáblás még picit új nekem.

Alkottam egy ilyet:

SELECT posts.*, users.nick AS nick
FROM `posts` 
RIGHT JOIN `users` ON posts.poster=users.id
RIGHT JOIN `users` ON 
(
SELECT COUNT(`poster`) AS `posts`, `poster` FROM `posts`  
    WHERE `site` = 'c' OR `site` = '0'   
    GROUP BY `poster`
)
WHERE `site` = 'c' OR `site` = '0' 
ORDER BY `date` DESC 
LIMIT 10;
de nem úsztam meg ennyivel, mert #1066-os hibát ad.
6

Valami ilyesmire

neogee · 2010. Dec. 13. (H), 08.07
Valami ilyesmire gondoltam:

SELECT * FROM (
	SELECT
		posts.id AS `post_id`,
		posts.date AS `post_date`,
		posts.text AS `post_text`,
		users.id AS `user_id`,
		users.nick AS `user_nick`
	FROM `posts`,`users`
	WHERE
		users.id = posts.poster
	ORDER BY posts.date DESC
) AS `posts_result`
JOIN (
	SELECT
		COUNT(posts.id) AS `post_num`,
		posts.poster AS `poster_id`
	FROM
		posts
	GROUP BY posts.poster
) AS `postsnum_result` ON user_id = poster_id
Nekem ezt a végeredményt adja:
eredmény

Remélem megoldja a problémát :)
7

Sebesség

Poetro · 2010. Dec. 13. (H), 14.40
Már csak az a kérdés, ez mennyivel lassabb, mint ha 2 lekérdezésben csinálnánk meg. Mert szerintem sokkal.
8

Működik

instantwater · 2010. Dec. 13. (H), 19.36
Kipróbáltam, működik, köszi.
A sebesség kérdéshez hozzátenném, hogy egyszerre max 20 sort listázok ki, kérdés, hogy ennyinél is számít-e a sebesség?
Mondjuk azt hozzá kell tenni hogy több mint 12000 post van.
9

Ha lassú, akkor csináljam meg inkább 2 külön lekérdezésben?

instantwater · 2010. Dec. 13. (H), 19.37
Ha lassú akkor csináljam meg inkább 2 külön lekérdezésben?
Ezért vagyok itt mert nem tudom, hogy hogy lenne célszerűbb.
10

Elsősorban szerintem nem a

neogee · 2010. Dec. 13. (H), 20.52
Elsősorban szerintem nem a postok száma, hanem a kérések gyakorisága tesz rosszat a sebességnek. Ha minden egyes lekéréskor lefut ez a lekérdezés, és mondjuk van percenként jópárszáz request, akkor valóban nem ártana kesselni... :) De én nem igazán értek az ilyesmihez, csak volt egy kérdés, amire megpróbáltam válaszolni. :) Mérd le terhelés alatt melyik a gyorsabb, és azt a megoldást használd. :)