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.
  1. <?php  
  2. // Connect and select mySQL database  
  3. require('../includes/mysql.php');   
  4.   
  5. $users = "SELECT name FROM groups";  
  6. $result = mysql_query($users);  
  7.   
  8. print "<TABLE BORDER=2 CELLPADDING=2>\n";  
  9. print "<table width=\"300\" border=\"1\">";  
  10. print "<tr>";  
  11. print "<td>Csoport neve</td>";  
  12. print "<td>Felhasznalok szama a csoportban</td>";  
  13. print "</tr>";  
  14.   
  15. while ($row = mysql_fetch_array($result)) {  
  16. print "<tr>";  
  17. print "<td>".$row['name']. "</td>";  
  18. print "</tr>";  
  19. }  
  20. print "</table>";  
  21. ?>  
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:
  1. select g.namecount(1) as tag_szam   
  2.   from groups g inner join user2groups u2g on g.id = u2g.gid  
  3. 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:
  1. $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");  
  2. $fetch = mysql_fetch_array($groups);  
  3.   
  4. 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:
  1. while ($row = mysql_fetch_array($result)) {  
  2. print "<tr>\n";  
  3. print "\t<td>".$row['name']."</td>\n";  
  4. print "</tr>\n";  
  5. }  
  6.   
  7. while ($fetch = mysql_fetch_array($groups)) {  
  8. print "\t<td>".$fetch['tag_szam']."</td>\n";  
  9. print "</tr>\n";  
  10. }  
es a kovetkezo kimenettet kapom :
  1. </tr>  
  2. <tr>  
  3.     <td>registered</td>  
  4. </tr>  
  5. <tr>  
  6.     <td>second</td>  
  7. </tr>  
  8.   
  9.     <td>4</td>  
  10. </tr>  
  11.     <td>1</td>  
  12. </tr>  
  13. </table>  
Lehet, hogy egyszeru de nem ertem, hogy kell beszurni a szamokat, hogy valami ilyen formabam legyenek :
  1. <tr>  
  2.     <td>Registered</td>  
  3.     <td>4</td>  
  4.   </tr>  
  5.   <tr>  
  6.     <td>Second</td>  
  7.     <td>1</td>  
  8.   </tr>  
6

megoldás

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

Koszonom !

Anonymous · 2006. Júl. 28. (P), 13.19
Koszonom ! Mukodik
  1. $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
  1. print "<TABLE BORDER=2 CELLPADDING=2>\n";  
  2. print "<table width=\"300\" border=\"1\">";  
  3. print "<tr>\n";  
  4. print "<td>Csoport neve</td>\n";  
  5. print "<td>Felhasznalok szama</td>\n";  
  6. print "</tr>\n";  
  7.   
  8. while ($row = mysql_fetch_array($groups)) {  
  9. print "<tr>\n";  
  10. print "\t<td>".$row['name']."</td>\n";  
  11. print "\t<td>".$row['tag_szam']."</td>\n";  
  12. print "</tr>\n";  
  13. }  
Egy gond van.
Ha nincs egy tag sem hozaadva a "Second" nevu csoporthoz csak a kovetkezo html tabla jelenik meg:
  1. Csoport neve   |  Felhasznalok szama  
  2. ====================================  
  3. Registered     |         4  


En peddig ezt szeretnem kiirni:
  1. Csoport neve   |  Felhasznalok szama  
  2. ====================================  
  3. Registered     |         4  
  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:
  1. $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
  1. select g.namesum(decode(u2g.gid, null, 0, 1)) as tag_szam   
  2.   from groups g LEFT OUTER JOIN user2groups u2g on g.id = u2g.gid  
  3.   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:
  1. $eredmeny = array();  
  2. while ($row = mysql_fetch_array($result)) {  
  3.  $gname = $row['name'];  
  4.  if(!isset($eredmeny[$gname])) {  
  5.   $eredmeny[$gname] = 0;  
  6.  }  
  7.  if($row['gid'] != '') {  
  8.   $eredmeny[$gname]++;  
  9.  }  
  10. }  
  11. foreach($eredmeny as $gname => $cnt) {  
  12.  echo "<tr><td>$gname</td><td>$cnt</td></tr>"  
  13. }  
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:
  1. SELECT g.nameCOUNT(u2g.uid) AS tag_szam   
  2. FROM groups g LEFT JOIN user2groups u2g ON g.id = u2g.gid  
  3. GROUP BY g.name