ugrás a tartalomhoz

Group by és max() SQL-ben - nem jól használom?

Anonymous · 2005. Aug. 3. (Sze), 12.13
Üdv Mindenkinek!

Segítséget szeretnék kérni egy sql lekérdezésben.
Adott egy fórum. Előszőr is kilistázom a topicokat, tid-jük alapján pedig GROUP By ozom őket. Lekérdezem a max-id-t is, ami az utolsó hozzászólás lenne, vagyis megadja a topic összes hozzászólását. Viszont ha a nevet akarom kiiratni akkor már nem jó valami. Nem az utolsót adja be. :(

Így néz ki:

$sql = mysql_query("SELECT topic, tid, name, max(date) AS date, max(id) AS id FROM forum Group By tid Order By date DESC")

A max(date) az jó. A max(id) is működik. de ha a nevet íratom ki akkor már egy teljesen más nem nevet ír ki!

Please Help me!
 
1

Mikor mit ír ki?

Poetro · 2005. Aug. 3. (Sze), 15.36
Nem teljesen értem a problémádat. A
GROUP BY
, mint tudjuk az azonos elemeket egynek tekinti, és értéknek egyet vesz közüllük (nem meghatározott, hogy melyiket). Namármost ha mégse ez a problémád, akkor kérlek írd le, mit vársz, és mit kapsz helyette. Persze, hozzá kell tennem, hogy ennek az egész topicnak semmi köze a PHPhoz.
--------
Poetro
2

<Nincs cím>

Anonymous · 2005. Aug. 3. (Sze), 20.49
le szeretném kérni egy fórum, azon belül egy topic utolsó üzenetének küldőjét (name) ahoz kapcsolódó dátumot (date) + az összes adatot ha lehet de az a kettő a legfontossabb.

a példa alapján minden őké csak a nevet köti rössz dátumhoz...
3

SQL szabvány vs MySQL szabvány

Hodicska Gergely · 2005. Aug. 4. (Cs), 00.21
Hát itt van a nagy baj. Hogy a MySQL nem követi az SQL szabványt.
mint tudjuk az azonos elemeket egynek tekinti, és értéknek egyet vesz közüllük
Nem tudjuk ;-), mert ilyen nincs, főleg igazi adatbázis kezelőkben.

A szabvány szerint a select lisátban olyan mező, amelyik szerint nem groupolunk, nem szerepelhet, csak egy aggregátor függvényben (max, count, stb.). Szóval a fenti query hibás, és egy adatbázis kezelő hibaüzenettel díjazná.


Felhő
4

<Nincs cím>

Anonymous · 2005. Aug. 4. (Cs), 11.58
Oké. Akkor MySQL szabvány szerint mondjatok egy olyan lekérdezést ami egy táblában Topic nevei alapján (tid alapján) kilistázza az összes topicot. A topic nevei mellé pedig az utolsó hozzászólás idejét és a hozzászóló nevét!
5

GROUP BY tid, name

Poetro · 2005. Aug. 4. (Cs), 18.26
SELECT topic, tid, name, MAX(date) AS date, MAX(id) AS id
FROM forum WHERE date = MAX(date) GROUP BY tid ORDER BY date DESC
vagy vmi ilyesmi. Lehet hogy a where helyett having kell.
--------
Poetro
6

<Nincs cím>

Anonymous · 2005. Aug. 4. (Cs), 21.52
SELECT topic, tid, name, MAX(date) AS date, MAX(id) AS id
FROM forum WHERE date = MAX(date) GROUP BY tid ORDER BY date DESC

nem műxik...
A having-et + nem tudom használni...

please help me!
7

<Nincs cím>

Anonymous · 2005. Aug. 10. (Sze), 00.56
Mégegyszer:

Segítsetek, hogyan oldjam meg azt Mysql lekérdezéssel, hogy a fent említett módon kilistázzá a fórum tid-jeit topic címeit dátumot ami a legutóbbi és a hozzájuk kapcsolodó nevet.

Ti hogyan oldanátok meg?
8

Hogyan oldanánk meg?

kgyt · 2005. Aug. 10. (Sze), 12.47
Valamilyen fórumon összerakatnánk a gyíkokkal, és felvennénk a lét...


--
Szeretettel: Károly György Tamás
kgyt(a)kgyt.hu - http://kgyt.hu
9

Hááát....

monghuz · 2005. Aug. 10. (Sze), 13.39
Csatlakozom az elöttem szólóhoz...

Amúgy meg ha nem értesz mysql-hez akkor a fapados módszer.. egy sima selectel lekérdezed az összes topicot, és amikor a while-val kiiratod akkor minden egyes topicnál csinálsz egy lekérdezést az utolsó hozzászólásra vonatkozóan....
<?
while($adatok = mysql_fetch_assoc($valami)) {
echo $adat['topicneve'].'<br>Utolsó hozzászólás: ';
$utolso_cucc = mysql_query("SELECT id, nick, date FROM hozzaszolasok
WHERE MAX(id)");
$adat2 = mysql_fetch_assoc($utolso_cucc);
echo $adat2['nick].' '.$adat2['date'];
?>
Tudom hogy full fapad, de müködik... ha valakinek nem tetszik akkor meg szenvedjen.

bye Tomi
10

subselectes megoldás

Sweetchack · 2005. Aug. 27. (Szo), 21.21

SELECT
	 t2.*
	FROM
		(SELECT nid, max(cimzett) as cimzett FROM ka_pmsg_msgc  GROUP BY nid) as t1,
		ka_pmsg_msgc as t2
	WHERE
		t1.nid = t2.nid
		AND t1.cimzett = t2.cimzett
(Akár INNER JOIN-nal is lehetne)

Mivel Poetro barátunk nyagyon profi cikket írt a hirarchikus adatkezelésről, ezért meglep hogy ezt az egyszerü SQL mondatot elsőre elvétette :)
Csak SubSelect-et ismerő MySQL-lel fog működni.