Jump to content


Photo

Distinct Usando Inner Join


  • Faça o login para participar
14 replies to this topic

#1 dinhozinho

dinhozinho

    12 Horas

  • Usuários
  • 183 posts
  • Sexo:Não informado

Posted 02/08/2009, 21:00

Seguinte, tô fazendo um sistema que suporta permissões do tipo, add, edit, exc.
Terá um painel em que o administrador poderá ver os privilégios de cada usuário, só que tipo, ele repete o nome da área que ele tem o privilegio, tipo:

O usuario 1 tem as 3 permissões na area de noticias que são adicionar, editar e excluir e na area categoria ele pode adicionar.
O Usuario 2 tem apenas a permissão para adicionar na area de noticia e categorias.
O Usuario 3 tem permissao pra adicionar, editar e excluir na area de categorias e adicionar na area de noticias, dai meu select está retornando da seguinte maneira

ID_USUARIO | MODULO | PERMISSAO

1 - Noticias - Adicionar
1 - Noticias - Editar
1 - Noticias - Excluir
1 - Categorias - Adicionar
2 - Noticias - Adicionar
2 - Categorias - Adicionar
3 - Categorias - Adicionar
3 - Categorias - Editar
3 - Categorias - Excluir
3 - Noticias - Adicionar

Eu gostaria que retornasse

1 - Noticias - Adicionar, Editar, Excluir
Categorias - Adicionar
2 - Noticias - Adicionar
Categorias - Adicionar
3 - Noticias - Adicionar
Categorias - Adicionar, Editar, Excluir

Claro, cada modulo tem seu proprio id, assim como suas permissões, vou colocar abaixo como está a instrução


$queryTestx = $db -> consulta('SELECT * FROM admin_modulos as A INNER JOIN admin_nivel_permissao as B INNER JOIN admin_permissao as C
ON(B.id_nivel_permissao = C.id_nivel_permissao) AND (A.id_modulo = C.id_modulo)');

foreach ($queryTestx as $valor) {
echo $valor['id_usuario'];
echo $valor['modulo'];
echo $valor['permissao'].'<br/>';
}


Dai tipo, eu coloquei um DISTINCT para ele não repetir o nome das categorias, só que ele não retorna as permissões que o usuário tem naquela categoria, isso foi com a seguinte instrução:

$queryTestx = $db -> consulta('SELECT distinct A.modulo FROM admin_modulos as A INNER JOIN admin_nivel_permissao as B INNER JOIN admin_permissao as C
ON(B.id_nivel_permissao = C.id_nivel_permissao) AND (A.id_modulo = C.id_modulo)');


Essa acima só retorna:

Notícias
Categorias

Obviamente..

Então, alguém tem alguma sugestão para mim?

#2 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 02/08/2009, 22:15

O MySQL provê uma interessante função GROUP_CONCAT(), que funciona justamente para retornar os valores de colunas que pertencem ao agrupamento. Isso não tem nativamente num Oracle, por exemplo. :D

Exemplo:
SELECT id_usuario, A.modulo, GROUP_CONCAT(permissao) as permissoes  FROM admin_modulos as A    INNER JOIN admin_nivel_permissao as B    INNER JOIN admin_permissao as C     ON B.id_nivel_permissao = C.id_nivel_permissao    AND A.id_modulo = C.id_modulo  GROUP BY id_usuario, A.modulo

Mais informações: http://dev.mysql.com...-functions.html
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#3 dinhozinho

dinhozinho

    12 Horas

  • Usuários
  • 183 posts
  • Sexo:Não informado

Posted 02/08/2009, 22:55

Eclesiastes, antes de mais nada, obrigado!

Essa função é bem interessante, não tinha conhecimento sobre ela, valeu a dica.

Abraço

(y)

Olha, só mais uma dúvidazinha, estou tentando no lugar de exibir o id, colocar o nome do usuário que no caso já vem de outra tabela chamada "admin_usuarios", estou tentando aqui colocar, mais meio que ainda não entendi bem o funcionamento da query, o nome do campo da tabela admin_usuarios é "nome" e "id_usuario"

olha como tá:

SELECT C.id_usuario, A.modulo, nome, GROUP_CONCAT(permissao) as permissoes
FROM admin_modulos as A
INNER JOIN admin_nivel_permissao as B
INNER JOIN admin_permissao as C
INNER JOIN admin_usuarios as D
ON B.id_nivel_permissao = C.id_nivel_permissao
AND
C.id_usuario = D.id_usuario
GROUP BY C.id_usuario, A.modulo, nome


O retorno ficou uma loucura, além de repetir várias vezes o nome do usuário com as permissões..

No caso seria para exibir da forma como já está funcionando + o nome do usuario puxando da tabela admin_usuarios

#4 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 02/08/2009, 23:08

Então você precisa usar:
GROUP BY nome, A.modulo

O que irá agrupar as linhas que possuem nome e modulo com mesmo valor, e então a GROUP_CONCAT() acessará os valores do campo permissao dentre os registros que possuem o mesmo valor em nome, modulo. :)
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#5 dinhozinho

dinhozinho

    12 Horas

  • Usuários
  • 183 posts
  • Sexo:Não informado

Posted 02/08/2009, 23:37

Desculpa, mais não sei se eu fui muito claro, no caso eu queria que ficasse na verdade assim:

1 - Jose -> Noticias - Adicionar, Editar, Excluir
Categorias - Adicionar
2 - João -> Noticias - Adicionar
Categorias - Adicionar
3 - Maria -> Noticias - Adicionar
Categorias - Adicionar, Editar, Excluir

ID | NOME | MODULO e suas permissões.. lá em cima na primeira dúvida, eu acabei esquecendo de citar isso, eu estou tentando adaptar a instrução que você passou, só que não estou conseguindo fazer funcionar, vamos dizer que estou quase! kkkkkkk
Só que o nome do usuario está retornando com o numero de permissões que ele tem..

Está agora assim:

SELECT C.id_usuario, A.modulo, D.nome, GROUP_CONCAT(permissao) as permissoes
  FROM admin_modulos as A
	INNER JOIN admin_nivel_permissao as B
	INNER JOIN admin_permissao as C 
	INNER JOIN admin_usuarios as D
	ON B.id_nivel_permissao = C.id_nivel_permissao
	AND A.id_modulo = C.id_modulo
	AND C.id_usuario = D.id_usuario
  GROUP BY C.id_usuario, A.modulo, D.nome

retornando...

-1 Jose CategoriasAdicionar
-1 Jose NotíciasEditar,Adicionar,Excluir
2 Joao CategoriasEditar
2 Joao NotíciasExcluir
3 Maria CategoriasEditar

repetindo os ids e o nome na linha

Edição feita por: dinhozinho, 02/08/2009, 23:37.


#6 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 02/08/2009, 23:56

Os dados que você deseja, estão sendo retornados como esperado. A query é para dizer como trazer os dados do banco. A formatação, se vai ou não exibir consecutivamente um campo ou não, etc. você trata na hora de mostrar os dados, com a linguagem que estiver utilizando. ;)
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#7 dinhozinho

dinhozinho

    12 Horas

  • Usuários
  • 183 posts
  • Sexo:Não informado

Posted 02/08/2009, 23:58

O problema é que ele tá repetindo, como estava anteriormente repetindo o campo do módulo, e tô utilizando php

foreach ($queryTestx as $valor) {
	echo $valor['id_usuario'];
	echo $valor['nome'];
	echo $valor['modulo'];
	echo $valor['permissoes'].'<br/>';
}

Vou ler mais a referência GROUP BY
Valeu pela ajuda cara, brigado.

#8 RonsisM

RonsisM

    Super Veterano

  • Usuários
  • 15724 posts
  • Sexo:Masculino
  • Localidade:Plovdiv

Posted 23/09/2017, 09:30

Achat Cialis Marseille cialis online Fluoxetine Want To Buy Virginia Amoxicillin Suspension Dosage For Cat Viagra 50 Ans Efficienza Propecia viagra cialis Cialis Sources In Canada
Buy Doxycycline In Canada cialis price Acheter Du Cialis En Andorre
Generic Viagra Pills To Buy In Usa Abc Online Pharmacy Classifica Propecia
Costo Del Cialis <a href=http://cialtobuy.com>cialis</a> Alternative Viagra Products
Forum Cialis Viagra cialis Cheap Priligy Drugs Achats De Kamagra Cialis 10mg Online Viagra Pastiglie Morbide Herbs Similar To Keflex viagra cialis Buy Doxycycline From Canada
Propecia Pas Cher Canada cialis online Comprar Viagra Sin Receta En Valencia
Amoxicillin Treatment Of Chlamydia
Cialis Effets Secondaires <a href=http://cialtobuy.com>generic cialis</a> Does Amoxicillin Affect Apri

#9 RonsisM

RonsisM

    Super Veterano

  • Usuários
  • 15724 posts
  • Sexo:Masculino
  • Localidade:Plovdiv

Posted 07/10/2017, 06:48

Cialis 20 Mg Indicazioni Catalogue Levitra viagra Achat Tadalis Sx Sans Risque How To Buy Cheap Worldwide Doryx 100mg
New Primatene Mist Inhaler cialis Levitra Che Cos'E Viagra Fa Ingrassare Pastillas Cialis Yahoo

#10 HaroNism

HaroNism

    Super Veterano

  • Usuários
  • 15385 posts
  • Sexo:Masculino
  • Localidade:San Miguel de Tucuman

Posted 07/10/2017, 18:51

Com Kamagra In Linea Buy Canine Prednisone levitra for sale Comparativa Cialis Viagra Buy Levothyroxine 50 Mcg Online Ireland Propecia Infarto

#11 Miguceamma

Miguceamma

    MiguPenjisse

  • Usuários
  • 13201 posts

Posted 08/10/2017, 10:27

Comprar Viagra Femenina Paginas Seguras cialis price Zentel Best Website Discount Price Overseas Denver
Discount Generic Isotretinoin Website Mastercard Store Winston Lioresal Injectable Zentel Alben viagra Buy Furosemide Tablets Je Besoin D'Un Abonnement Pour Dapoxetine Amoxicillin Low Cost
Need Synthroid No Rx Lioresal En Ligne France Buy Accutane Online Fast Delivery viagra online prescription Cialis For Sale In Canada 168 Allergic To Amoxicillin Hereditary Viagra Rezeptfrei Osterreich

#12 HaroNism

HaroNism

    Super Veterano

  • Usuários
  • 15385 posts
  • Sexo:Masculino
  • Localidade:San Miguel de Tucuman

Posted 09/10/2017, 10:49

Buy Prednisone Without Prescription Can Amoxicillin Be Taken When Expired Rx Cheap Propecia viagra Usa Levitra

#13 RonsisM

RonsisM

    Super Veterano

  • Usuários
  • 15724 posts
  • Sexo:Masculino
  • Localidade:Plovdiv

Posted 21/10/2017, 03:15

Keflex Substitutions Cegaba O Propecia Comprar Cialis Andalucia online pharmacy Which Is Better Cipro Or Amoxicillin Prix Levitra Pas Cher
Zythromax Vs Cephalexin Amoxicillin 500mg No Prescription buy viagra Propecia Price Priligy Dapoxetina Dosaggio
Levitra 40mg Sale Purchase Fluoxetine Viagra Kaufen Wirkung cheap levitra Real Progesterone Where To Buy Price On Line Colchicine

#14 RonsisM

RonsisM

    Super Veterano

  • Usuários
  • 15724 posts
  • Sexo:Masculino
  • Localidade:Plovdiv

Posted 02/11/2017, 20:51

Alimenti Con Dapoxetina Effexor Discount Coupons Acquisto Viagra Forum buy viagra Did Keflex Cause Lower Platelets Viagra Y Ejercicio Edmundo Propecia
Keflex For Staff Infection viagra online prescription Spironolactone By Paypal Payment Comprar De La Propecia
Fluconazole Cheap Buy Cheap Antabuse Moyens De Durer Plus Longtemps Au Lit vardenafil in osterreich erhaltlich Cephalexin Mod Kamagra Estados Unidos Kamagra En Madrid

#15 RonsisM

RonsisM

    Super Veterano

  • Usuários
  • 15724 posts
  • Sexo:Masculino
  • Localidade:Plovdiv

Posted 24/11/2017, 04:23

Canadian Meds No Prescription Kamagra Livraison Rapide Achat order on line levitra Levaquin Order Tablets Propecia Folcres La Caida Del Cabello
Tooth Abcess And Amoxicillin Bentyl Muscle Spasms Internet Mastercard Accepted Without Perscription Buy Herbal Viagra vardenafil vs viagra Effet Du Cialis
Purchase Viagra In India Amoxil Allergies Propecia Medicine buy viagra online Generique Du Cialis 5mg Tinidazole Over The Counter Comprar Levitra Generico En Andorra




0 user(s) are reading this topic

0 membro(s), 0 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq