Jump to content


Photo

Localizar E Exibir Registros Duplicados


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

#1 Bruno Augusto

Bruno Augusto

    ∙•● Restarting... ●•∙

  • Usuários
  • 1968 posts
  • Sexo:Não informado
  • Localidade:Itajubá

Posted 05/05/2008, 10:19

Eu juro, comecei esse tópico em MySQL, mas tudo bem.

Normalmente não se faz uma pergunta dessas, pois quase sempre se deseja excluir de uma listagem de resultados os repetidos. E para isso usamos DISTINCT

Mas preciso fazer o contrário para Controle de Acesso à um sistema.

Uso, como de praxe, um query assim para retornar um array com informações:

SELECT * FROM `logs` WHERE `time` = "' . base64_decode( $_GET['time'] ) . '"ORDER BY `IP` ASC
E obtenho:

Array
(
[0] => Array
(
[ID] => 1
[username] => UM
[email] => um
[date] => 2008-05-05
[time] => 09:17:25
[IP] => 127.0.0.1
)

[1] => Array
(
[ID] => 2
[username] => UM
[email] => um
[date] => 2008-05-05
[time] => 09:17:25
[IP] => 127.0.0.1
)

)

Só exemplo.

Porém eu queria poder identificar os índices cujos campos time sejam iguais para que pudesse evitar compartilhamento das licenças do serviço.

No exemplo, os dois, claro.

O problema é que só imagino como fazer. Acredito que sejam tabelas temporárias, mas nunca as usei, logo, me enrolei.

Taí até um ditado: "Eu penso, logo me complico" ^^

#2 boirock

boirock

    Tecnologia para todos (agora hexa campeão)

  • Usuários
  • 1559 posts
  • Sexo:Masculino
  • Localidade:Curitiba - PR
  • Interesses:PostgreSQL - PHP

Posted 05/05/2008, 10:39

Eu juro, comecei esse tópico em MySQL, mas tudo bem.

Como assim? :blink: rs...

Bem... tabela temporária é desnecessário nesse caso. Uma boa procedure resolveria...

Mas mesmo assim, acho que você poderia agrupar os dados por esse campo time fazendo um COUNT, usando um HAVING onde o resultado desse COUNT seja maior que 1 (y)

#3 Bruno Augusto

Bruno Augusto

    ∙•● Restarting... ●•∙

  • Usuários
  • 1968 posts
  • Sexo:Não informado
  • Localidade:Itajubá

Posted 05/05/2008, 10:49

Então, eu até dei uma busca no Google e encontrei algo semelhante ao que você disse no Linha de Código. Mas ao testar deu erro na query.

#4 boirock

boirock

    Tecnologia para todos (agora hexa campeão)

  • Usuários
  • 1559 posts
  • Sexo:Masculino
  • Localidade:Curitiba - PR
  • Interesses:PostgreSQL - PHP

Posted 05/05/2008, 10:52

Posta a query e o erro aí (y)

#5 Alex Hiroshi

Alex Hiroshi

    Super Veterano

  • Ex-Admins
  • 4923 posts
  • Sexo:Masculino
  • Localidade:São Paulo - SP

Posted 05/05/2008, 11:01

Esse tópico ajuda?
http://forum.wmonlin...howtopic=195727
Fórum WMO - Equipe de Desenvolvimento / Banco de Dados - Ex-Administrador

#6 Bruno Augusto

Bruno Augusto

    ∙•● Restarting... ●•∙

  • Usuários
  • 1968 posts
  • Sexo:Não informado
  • Localidade:Itajubá

Posted 05/05/2008, 11:04

Na verdade eu dificilmente entendo mysql_error()

Com a query adptada:

$query	=	'SELECT `time`,COUNT(*) FROM `logs` HAVING COUNT(*) > 1 GROUP BY `time`';
Resulta:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP BY time' at line 1


Daí tem três coisas. Como o erro parece estar dadno no GROUP BY, tirando dá:

Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause

Segundo que eu preciso realmente comparar dois ou mais campos, logo preciso do WHERE que no exemplo não tinha
E terceiro que, comparando com a query inicial (sem verificação), essa só lista a hora. Se eu especificar mais de um campo (ou o próprio *) dá o mesmo segundo erro (do segundo quote).

[EDIT]

Bom, eu consegui alguma cisa com a explicação do Eclesiastes no tópico linkado pelo Alex.

Mas veja bem, talvez nem seja referente ao tópico em si, mas se houver diferença de UM SEGUNDO no valor armazenado em time (campo do tipo TIME) já não aparece nessa verificação.

Edição feita por: Bruno Augusto, 05/05/2008, 14:18.


#7 Fabrício Pinto

Fabrício Pinto

    Novato no fórum

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

Posted 16/02/2009, 15:32

Pra quem precisar, o código abaixo faz a consulta de registros duplicados em uma determinada tabela. Testei no pl/sql developer com oracle e funcionou:

select tab1.*
from tabela_1 tab1
where rowid < (select max(rowid)
from tabela_1 tab2
where tab1.campo0 = tab2.campo0);

lembrando que tab1 e tab2 são nomes dados a mesma tabela, tabela_1.

Se precisarem do delete, é só usar:

delete tabela_1 tab1
where rowid < (select max(rowid)
from tabela_1 tab2
where tab1.campo0 = tab2.campo0);

Abraços!

#8 LarPhozyHah

LarPhozyHah

    Super Veterano

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

Posted 23/09/2017, 14:16

Propecia Dosage Or 5mg cialis online Canadian Phrmacy discount generic accutane Cialis Comparatif Prix




0 user(s) are reading this topic

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

IPB Skin By Virteq