webForumDet fria alternativet

sortera efter rubriker

6 svar · 246 visningar · startad av S@rpp@

S@rpp@Medlem sedan okt. 200058 inlägg
#1

Har följande problem:

På en sida presenteras alla diskussionsgrupper med rubrikerna:
Gruppnamn Antal_inlägg Datum_senaste dvs samma upplägg som på webForum.

I databasen lagras kortfattat:
Groups: g_id, g_name
Texts: t_id, g_id, inlagg, mtime,user_id

Jag hämtar ut grupper från databasen, totalt antal inlägg och datumet/tid för senaste inlägget.....

...
$q="select g_id, g_name from groups";

$r=pg_exec($connect,$q);
$n=pg_numrows($r);
for($i=0;$i<$n;$i++)
{
$gid=pg_result($r,$i,0);
$name=pg_result($r,$i,1);

echo "\<tr\>\<td\>$name:\</td\>";
$q2="select count(inlagg),max(mtime) from texts where g_id=$gid";
echo "\<td\>";
$r2=pg_exec($connect,$q2);
echo pg_result($r2,0,0);
echo "\</td\>";
echo "\<td\>";
echo substr(pg_result($r2,0,1),0,16);
echo "\</td\>\</tr\>\\n";

}
....

Nu vill jag att genom att klicka på ex. "Gruppnamn"-rubriken ska grupperna sorteras i bokstavsordning, klickar man på "Antal inlägg"-rubriken ska den grupp som har flest inlägg vara högst upp....alltså borde jag slå ihop ovanstående SQL-sats till en enda och använda ORDER BY....

$q="select groups.g_id,groups.name count(inlagg) as antal, max(mtime) as tid from texts, groups where groups.gid=texts.gid group by groups.gid, groups.name order by groups.name asc";

...men nu kommer ju inte grupper som inte har några inlägg med!!!!! Och jag vill visa gruppnamnet även fast det ännu inte skrivits in några inlägg!!!

Hur ska jag bära jag mig åt??

nanneMedlem sedan dec. 19991 749 inlägg
#2

Frågan borde väl ställas i mySQL forumet?

------------------

"Där ser du. De är synthare och inte scientologer..."

nanne.net

LarsGMedlem sedan dec. 200012 464 inlägg
#3

Man kan använda en outer join:

select groups.g_id,groups.g_name, count(inlagg) as antal,
max(mtime) as tid from texts right outer join groups on        
groups.g_id = texts.g_id
group by groups.g_id, groups.g_name order by groups.g_name asc

En right outer join tar alla rader från den högra tabellen. Om det inte finns någon match i den vänstra tabellen så får man en rad där dessa kolmner är null annars blir det som en vanlig join.

(Jag ändrade kolumnnamnen så att de blev samma som du skrev i inledningen)

------------------
essentitia preter non sans multiplicandum

S@rpp@Medlem sedan okt. 200058 inlägg
#4

Jag får följande varing:
Warning: PostgreSQL query failed: ERROR: OUTER JOIN is not yet supported in /usr/local/www/data/site/test.phtml on line 14

Rad 14 är:$res=pg_exec($connect,$sqls);

LarsGMedlem sedan dec. 200012 464 inlägg
#5

Jag har aldrig använt Postgres så jag har ingen koll på vad dom kan i avseende på SQL.

Det här är en alternativ formulering, men den kanske inte fungerar heller.

select groups.g_id,groups.g_name,
(select count(inlagg) as antal,
max(mtime) as tid from texts where groups.g_id = texts.g_id) from groups
order by groups.g_name asc

------------------
essentitia preter non sans multiplicandum

S@rpp@Medlem sedan okt. 200058 inlägg
#6

nja....jag får nog ge upp med att försöka få med all information i en enda sqlsats. Det kanske går med ngt i stil med:
1. Först hämta alla grupper lägga in det i en array.
2. för varje gruppid hämta antalet inlägg och senast inlagda och lägga in det i arrayen.
3. Använda ngn av sorteringsfunktionerna för array som finns....????

LarsGMedlem sedan dec. 200012 464 inlägg
#7

Okej, ett förslag till. Man kan använda en union

select groups.g_id,g_name, count(inlagg) as antal,
max(mtime) as tid from texts,groups
where 
groups.g_id = texts.g_id
group by groups.g_id, groups.g_name
union
select g_id,g_name,0,null
from groups g
where not exists (select * from texts where g_id = g.g_id)
order by g_name asc

Den första delen tar fram de grupper som har inlägg och den andra tar fram de som inte har inlägg.
Det är möjligt att Postgres inte godkänner att man har null med i select-listan, i så fall fär man väl slänga in något datum där och maska bort det sedan.

------------------
essentitia preter non sans multiplicandum

133 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)