← PHP

SELECT DISTINCT

Lida 4825 vezes

Offline

Jota Jota 
Membro
Mensagens 10 Gostos 0
Troféus totais: 16
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Level 3 Level 2 Level 1 10 Posts First Post Karma Seventh year Anniversary

Boas pessoal!

Tenho a seguinte query:

Código: [Seleccione]
$sql_produtos="SELECT distinct ref FROM $tbl_name where activo='1' order by id desc LIMIT $start, $limit";
Preciso de fazer um distinct da referencia apenas, sem que afecte as outras tabelas da BD. Como posso fazer isso?

Cumps.
Offline

dblue_one 
Membro
Mensagens 263 Gostos 0
Feedback +2

Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Level 4 Level 3 Level 2 Level 1 100 Posts 50 Posts 10 Posts

Não percebo a pergunta....estás um select a uma tabela e não queres que afecte as outras??? teres o distinct não te vai trazer registos repetidos....

Tens de explicar isso melhor!
Offline

Jota Jota 
Membro
Mensagens 10 Gostos 0
Troféus totais: 16
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Level 3 Level 2 Level 1 10 Posts First Post Karma Seventh year Anniversary

Ups... Queria dizer sem que afecte os outros campos da tabela.
Quero que o distinct afecte apenas o campo "ref" da tabela.
Offline

dblue_one 
Membro
Mensagens 263 Gostos 0
Feedback +2

Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Level 4 Level 3 Level 2 Level 1 100 Posts 50 Posts 10 Posts

Então o que precisas é algo deste tipo:

SELECT ref,
       colb,
       colc
FROM   (SELECT ref,
               colb,
               colc,
               Row_number() OVER(PARTITION BY ref ORDER BY colb) rn
        FROM   table1) t

where rn = 1

Retorna-te todos os campos distinct da coluna ref sem condição
Offline

Jota Jota 
Membro
Mensagens 10 Gostos 0
Troféus totais: 16
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Level 3 Level 2 Level 1 10 Posts First Post Karma Seventh year Anniversary

Já tá!
Fiz da seguinte maneira:

Código: [Seleccione]
$sql_produtos="SELECT distinct ref FROM $tbl_name";
$resultados_produtos=mysql_query($sql_produtos);

$var_1=array();
while($linha_produtos=mysql_fetch_array($resultados_produtos)){
        $sql_produtos_2="SELECT * FROM $tbl_name where activo='1' and ref=$linha_produtos[ref] order by id desc LIMIT 1";
        $var_1[]=mysql_query($sql_produtos_2);
}
Offline

dblue_one 
Membro
Mensagens 263 Gostos 0
Feedback +2

Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Level 4 Level 3 Level 2 Level 1 100 Posts 50 Posts 10 Posts

Um select com um * num ambiente de produção é motivo para taquicardia para muitos DBAs  :lol:
Diria que a tua solução está non tunning, mas tb serve ;)

Abraço
Offline

southafrikanse 
Membro
Mensagens 33 Gostos 0
Troféus totais: 20
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 10 Posts First Post

Um select com um * num ambiente de produção é motivo para taquicardia para muitos DBAs  :lol:
Diria que a tua solução está non tunning, mas tb serve ;)

Abraço

Isso depende muito da informação que estás a querer aceder na altura que estás a fazer o query. E tem muito a haver com a performance que o motor de base de dados vai usar ao fazer o SELECT aos campos. Se pretendes consultar TODOS os campos da tabela, então sim, faz sentido usar o SELECT *.

A maioria do pessoal nunca pensa, numa fase inicial, em optimizar o código mas sim, ver se funciona. Eu pessoalmente prefiro perder algum tempo a melhorar o código logo no início.
 
A única dúvida que tenho é usar o DISTINCT. Sempre me foi dito para nunca usar o DISTINCT porque posso estar a perder informação. Daí, usar mais as condições do query para obter o melhor resultado possível.
Offline

dblue_one 
Membro
Mensagens 263 Gostos 0
Feedback +2

Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Level 4 Level 3 Level 2 Level 1 100 Posts 50 Posts 10 Posts

E não disseste nenhum disparate, antes pelo contrário, mas eu tb não!

Abraço ;)
Offline

kaydara 
Membro
Mensagens 616 Gostos 1
Feedback +1

Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 500 Posts 100 Posts

o distinct tem a sua utilidade... dizer para não o usar... não entendo... desde que bem aplicado, ao dizeres que te disseram que podes perder informação... dás a sensação de quem não entende minimamente o que está a ser feito por detrás desses comandos...

quando ao select * é de evitar... mesmo que se queira todos os campos.

Ler o manual de SQL tem muita utilidade pessoal
Offline

dblue_one 
Membro
Mensagens 263 Gostos 0
Feedback +2

Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Level 4 Level 3 Level 2 Level 1 100 Posts 50 Posts 10 Posts

Eu percebo o que ele quiz dizer, de facto o distinct mal usado pode produzir o efeito de perca de registos, mas tb concordo ctg, em certas situações é muito util, mas tem de ser bem usado.

O * em ambientes de produção empresarial não se pode usar... ponto, eu nas minhas funções de DBA Oracle/SQL Server em BD's criticas até uso evitar o p não vá o dedo escorregar para o *  :lol:
Quando desenvolvo para a web, em bds pequenas, uso claro, não têm grandes implicações na performance da dita, e queima-se menos neurónios, por isso tb percebo o que diz o colega forista.

Mas em conclusão, claro que sou sempre mais apologista da performance do que da preguiça ;)
Offline

Jota Jota 
Membro
Mensagens 10 Gostos 0
Troféus totais: 16
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Level 3 Level 2 Level 1 10 Posts First Post Karma Seventh year Anniversary

Por vezes o tempo não dá para "embelezar" o código!  loool

Mas já agora, qual o problema do "*"?
Offline

cpdesign 
Membro
Mensagens 235 Gostos 0
Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 100 Posts 50 Posts

Mas já agora, qual o problema do "*"?

O * selecciona todas as colunas de uma tabela.
Se tiveres poucos registos, não terás grandes problemas.
Mas se executares uma query sobre uma tabela com milhares de registos, terás problemas de desempenho, estarás a usar recursos desnecessários da máquina (processador e memória).
Além do mais, se necessitas apenas 1 ou 2 colunas, qual a razão de estar a puxar dados que não interessam?

Em ambientes web, estar a puxar colunas desnecessárias poderá constituir um problema de segurança - aumento da vulnerabilidade.
Offline

dblue_one 
Membro
Mensagens 263 Gostos 0
Feedback +2

Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Level 4 Level 3 Level 2 Level 1 100 Posts 50 Posts 10 Posts

O * selecciona todas as colunas de uma tabela.
Se tiveres poucos registos, não terás grandes problemas.
Mas se executares uma query sobre uma tabela com milhares de registos, terás problemas de desempenho, estarás a usar recursos desnecessários da máquina (processador e memória).
Além do mais, se necessitas apenas 1 ou 2 colunas, qual a razão de estar a puxar dados que não interessam?

Em ambientes web, estar a puxar colunas desnecessárias poderá constituir um problema de segurança - aumento da vulnerabilidade.


Nem mais!

Já vi um sistema pendurar com centenas de utilizadores aos gritos por causa de um simples select * from xxtable