ugrás a tartalomhoz

Hany user van egy bizonyos csoportban

Anonymous · 2006. Júl. 28. (P), 11.46
Sziasztok
Van ket mySQL tablam:

groups:

id  | name
================
1   | registered
2   | second
user2groups:

uid  | gid
================
1    | 1
2    | 1
3    | 1
4    | 1
4    | 2
Van 4 regisztralt felhasznalom az adatbazisban, mindegyik automatikusan tagja az elso csoportnak (registered), kiveve a 4-ik felhasznalot amely tagja a (second) csoportnak is. Ez jol latszik az user2groups tablaban.

Letrehoztam egy groups.php fajlt amelyben szeretnem egy tablaba kilistazni az oszes csoportnak a nevet es hany felhasznalo van abban a csoportban.

<?php
// Connect and select mySQL database
require('../includes/mysql.php'); 

$users = "SELECT name FROM groups";
$result = mysql_query($users);

print "<TABLE BORDER=2 CELLPADDING=2>\n";
print "<table width=\"300\" border=\"1\">";
print "<tr>";
print "<td>Csoport neve</td>";
print "<td>Felhasznalok szama a csoportban</td>";
print "</tr>";

while ($row = mysql_fetch_array($result)) {
print "<tr>";
print "<td>".$row['name']. "</td>";
print "</tr>";
}
print "</table>";
?>

Hogyan tudom kilistazni a felhasznalok szamat peldaul igy:

Csoport Neve  | Felhasznalok szama a csoportban
-----------------------------------------------
Registered    |      4
Second        |      1
Kerek egy kis segitseget, barmilyen otlet jol jon. Koszonom !
 
1

group by

zsepi · 2006. Júl. 28. (P), 11.58
bár nem írtad, hányas mysql-t használsz, a group by jó erre:
select g.name, count(1) as tag_szam 
  from groups g inner join user2groups u2g on g.id = u2g.gid
group by g.name
megjegyzes: a szintaktika ora9-es, nem t'om, mysql alatt milyen joinok vannak

ui: a tábla fejlécében ne td-t, hanem th-t használj :)
2

mysql

Anonymous · 2006. Júl. 28. (P), 11.59
a mySQL verzio szama 4.1. Szerinted jo?
3

kosz

Anonymous · 2006. Júl. 28. (P), 12.05
Ha ezt beirom:

$groups = mysql_query("select g.name, count(1) as tag_szam from groups g inner join user2groups u2g on g.id = u2g.gid group by g.name");
$fetch = mysql_fetch_array($groups);

print $fetch['tag_szam'];
akkor elojon, hogy 4.
Gondolom latja, hogy 4 felhasznalo van az elso csoportba.
Most ki kene irja, hogy 1 felhasznalo van a masodik csoportban.

Hogyan tudom ezt az egeszet a tablaba beszurni.

Tudnal segiteni egy peldaval ?
4

ugyanugy, ahogy a nevekkel csináltad

zsepi · 2006. Júl. 28. (P), 12.26
A témaidndítódban a következőt csináltad:

futtattál egy selektet (egy oszlopos), soronként végigmentél az eredményen, majd kiírtad egy html táblába adott sorának első oszlopába a csoport nevét.

Most annyi a különbség, hogy két oszlopa van a lekérdezésnek, de amúgy minden ugyanaz, csak soronként két oszlopot írsz majd ki egy helyett.
5

probaltam...

Anonymous · 2006. Júl. 28. (P), 13.00
Probaltam igy:

while ($row = mysql_fetch_array($result)) {
print "<tr>\n";
print "\t<td>".$row['name']."</td>\n";
print "</tr>\n";
}

while ($fetch = mysql_fetch_array($groups)) {
print "\t<td>".$fetch['tag_szam']."</td>\n";
print "</tr>\n";
}
es a kovetkezo kimenettet kapom :

</tr>
<tr>
	<td>registered</td>
</tr>
<tr>
	<td>second</td>
</tr>

	<td>4</td>
</tr>
	<td>1</td>
</tr>
</table>
Lehet, hogy egyszeru de nem ertem, hogy kell beszurni a szamokat, hogy valami ilyen formabam legyenek :

<tr>
    <td>Registered</td>
    <td>4</td>
  </tr>
  <tr>
    <td>Second</td>
    <td>1</td>
  </tr>
6

megoldás

zsepi · 2006. Júl. 28. (P), 13.10
while ($row = mysql_fetch_array($result)) {
  print "<tr>\n";
  print "\t<td>".$row['name']."</td>\n";
  print "\t<td>".$fetch['tag_szam']."</td>\n"; /* azért ide, hogy a csoport mellett jelenjen meg a tagszám */
  print "</tr>\n";
}
7

Koszonom !

Anonymous · 2006. Júl. 28. (P), 13.19
Koszonom ! Mukodik

$groups = mysql_query("select g.name, count(1) as tag_szam from groups g inner join user2groups u2g on g.id = u2g.gid group by g.name");
A kovetkezo keppen nez ki a tabla

print "<TABLE BORDER=2 CELLPADDING=2>\n";
print "<table width=\"300\" border=\"1\">";
print "<tr>\n";
print "<td>Csoport neve</td>\n";
print "<td>Felhasznalok szama</td>\n";
print "</tr>\n";

while ($row = mysql_fetch_array($groups)) {
print "<tr>\n";
print "\t<td>".$row['name']."</td>\n";
print "\t<td>".$row['tag_szam']."</td>\n";
print "</tr>\n";
}
Egy gond van.
Ha nincs egy tag sem hozaadva a "Second" nevu csoporthoz csak a kovetkezo html tabla jelenik meg:

Csoport neve   |  Felhasznalok szama
====================================
Registered     |         4


En peddig ezt szeretnem kiirni:

Csoport neve   |  Felhasznalok szama
====================================
Registered     |         4
Second         |   0, vagy ures mezo


Meg lehet oldani ?
8

outer join

zsepi · 2006. Júl. 28. (P), 13.41
keresgélj a(z) (left) outer join témakörben
9

Utana neztem

Anonymous · 2006. Júl. 28. (P), 13.55
Utana neztem a dolognak, de ha kovetkezo keppen irom ki:

$groups = mysql_query("select g.name, count(1) as tag_szam from groups g LEFT OUTER JOIN user2groups u2g on g.id = u2g.gid group by g.name");
Akkor ezt kapom :

Csoport neve   |  Tagok szama
=============================
Registered     |      4
Second         |      1
A second csoportban nincs egy user sem, az 1-es helyet egy 0-at kene irjon.

Kerlek ha birsz kicsit segitsel. Muszaj ezt megcsinalnom estig mukodjon. Tobbet nem kerdek csak ez mukodjon!
10

decode, vagy gányolj egyet

zsepi · 2006. Júl. 28. (P), 14.31
select g.name, sum(decode(u2g.gid, null, 0, 1)) as tag_szam 
  from groups g LEFT OUTER JOIN user2groups u2g on g.id = u2g.gid
  group by g.name
az oracle decode függvénye annyit tud, hogy ha az első paraméter értéke megegyezik a második paraméter értékével, akkor a harmadik paraméter lesz az értéke, ha nem egyezik, akkor meg a negyedik. Kvázi egy if-else.

Mysql alatt nem tudom, van-e ilyen függvény, guglizz, esetleg írj az sql levelistára

vagy, ha most csak sürgős határidőd van, s nem végleges leadás, akkor kérdezd le azt, hogy g.name, u2g.gid, csinálj egy hastháblát, valahogy így, majd abból generáld a táblát:
$eredmeny = array();
while ($row = mysql_fetch_array($result)) {
 $gname = $row['name'];
 if(!isset($eredmeny[$gname])) {
  $eredmeny[$gname] = 0;
 }
 if($row['gid'] != '') {
  $eredmeny[$gname]++;
 }
}
foreach($eredmeny as $gname => $cnt) {
 echo "<tr><td>$gname</td><td>$cnt</td></tr>"
}
majd nézz utána a rendes megoldásnak, mert ez egy csúnya gányolt, s memóriaigényes meg lassú megoldás
11

COUNT(uid)

Rici · 2006. Júl. 28. (P), 18.08
Nem tudom honnan jött ez a count(1) dolog, de elég furcsán néz ki.

A helyes megoldás:

SELECT g.name, COUNT(u2g.uid) AS tag_szam 
FROM groups g LEFT JOIN user2groups u2g ON g.id = u2g.gid
GROUP BY g.name