COUNT si GROUP BY .

Întrebări legate de conectarea la baze de date MySQL prin intermediul PHP

Moderatori: Zamolxe, Moderatori

Avatar utilizator
marius4896
Average Member
Mesaje: 106
Membru din: Vin Oct 31, 2008 12:55 am
Contact:

COUNT si GROUP BY .

Mesajde marius4896 » Joi Iun 09, 2011 1:26 am

Salut,
Va rog daca ma puteti ajuta cu o interogare.
Am facut cu codeigniter un script de user management, asociati in grupuri, iar fiecare grup cu un numar de permisiuni de access ( si acestea setate la randul lor intr-un tabel special, pentru a mai putea adauga pe viitor )

avem
Tabel useri ( u_id, u_group... etc )
Tabel grupuri ( g_id, g_nume... etc )
Tabel permisiuni ( p_id, p_nume, p_alias... etc)
Tabel permisiuni_grup ( id_grup, id_permisiune)

Doresc o interogare in care sa imi apara, nume grupului, numarul de useri in grupul acela, si numarul de permisiuni pe care il are ( sa zicem ca aveam un total de 15 permisiuni ex: can_view_index, can_edit_article, can_publish_article.. etc )

Am incercat doua variante.
Varianta Codeigniter

Cod: Selectaţi tot

$this->db
      ->distinct()
      ->select("g.*, COUNT(u.u_id) as total_useri, COUNT(pg.id_permisiune) as total_permisiuni")
      ->from("grupuri g")
      ->join("useri u", "g.g_id = u.u_group", "LEFT")
      ->join("permisiuni_grup pg", "g.g_id = pg.id_grup", "LEFT")
      ->group_by("g.g_id, u.u_id")
      ->limit($limit, $offset)
      ->order_by("total_permisiuni", "desc")
      ->get()
      ->result_array();


Rezultatul este dezamagitor

Cod: Selectaţi tot

Id     Nume Grup     Descriere       Nr Useri    Nivelu
1      Admin           Administrator  15            15
2      Editor            Editor             2               2


Nivelul este ok, adminul intradevar are 15 permisiuni ( toate ) si editorul 2 . Dar admini am 2, si editori am 4

Varianta in SQL tradusa din Codeigniter ar fi ceva de genul

Cod: Selectaţi tot

SELECT DISTINCT `g`.*, COUNT(u.u_id) as total_useri, COUNT(pg.id_permisiune) as total_permisiuni
FROM (`grupuri` g)
LEFT OUTER JOIN `useri` u ON `g`.`g_id` = `u`.`u_group` 
LEFT OUTER JOIN `permisiuni_grup` pg ON `g`.`g_id` = `pg`.`id_grup`
GROUP BY  `g`.`g_nume`, `u`.`u_id`
ORDER BY `total_permisiuni` desc
LIMIT 10


Are careva vre-o idee, sau ma rezum in a mai face 2 interogari separate pentru a determina numarul de utilizatori respectiv permisiuni pe care le are fiecare grup ?

Multumesc.



Avatar utilizator
marius4896
Average Member
Mesaje: 106
Membru din: Vin Oct 31, 2008 12:55 am
Contact:

Mesajde marius4896 » Dum Iun 12, 2011 9:10 pm

Nu ? Chiar nimeni ?


Înapoi la “MySQL”

Cine este conectat

Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 25 vizitatori