Jump to content


Photo

Hyper Duvida Em Consulta No Mysql


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

#1 _AleMAuM_

_AleMAuM_

    Turista

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

Posted 12/08/2006, 14:30

Eaw gurizada..... ;)

Estou com um problema terrivel, estou com duas tabelas identicas e com valores identicos nas duas tambem, ja procurei no forum sobre isso e no google, mas não achei uma solução satisfatoria. :(
As tabelas foram criadas da seguinte forma:

CREATE TABLE `artistas` (
  `id` int(11) NOT NULL auto_increment,
  `artista` varchar(255) default NULL,
  `artista2` varchar(255) default NULL,
  `musicas` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


CREATE TABLE `musicas1` (
  `id` int(11) NOT NULL auto_increment,
  `titulo` varchar(255) default NULL,
  `formato` varchar(255) default NULL,
  `arquivo` varchar(255) default NULL,
  `diretorio` varchar(255) default NULL,
  `tamanho` float(10,5) unsigned default NULL,
  `artista` int(11) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED;


CREATE TABLE `musicas2` (
  `id` int(11) NOT NULL auto_increment,
  `titulo` varchar(255) default NULL,
  `formato` varchar(255) default NULL,
  `arquivo` varchar(255) default NULL,
  `diretorio` varchar(255) default NULL,
  `tamanho` float(10,5) unsigned default NULL,
  `artista` int(11) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED;

Dessa maneira eu tenho um registro de todas as minhas musicas armazenadas em meu computador, mas existem muitas dessas que tenho duplicadas, mas nao com o mesmo nome de arquivo, mas sim com o mesmo tamanho, cantor, titulo mas em diretorios diferentes, imaginem o espaço desperdicio de hd que eu tenho, são mais de 109,580 gb de musicas que venho coletando na net e com amigos. :(

Então criei a seguinte consulta que me lista todas os registro que contem as mesma informações.

SELECT 
m.id, m2.id AS id2, m.tamanho, m2.tamanho AS tamanho2, m.titulo, m2.titulo AS titulo2, m.diretorio, m2.diretorio AS diretorio2 
FROM musicas1 AS m 
LEFT JOIN musicas2 AS m2 
ON
m.titulo = m2.titulo AND m.tamanho=m2.tamanho AND m.artista = m2.artista
WHERE m.id != m2.id
ORDER BY m2.id

Mas o problema é que desta forma ele lista o registro desta maneira: :(

+-----+------+--------+---------+
| id  | id2  | titulo | titulo2 |
+-----+------+--------+---------+
| 482 |   13 | Crazy  | Crazy   |
|  13 |  482 | Crazy  | Crazy   |
+-----+------+--------+---------+

e eu queria que foce da seguinte maneira: :)

+-----+------+--------+---------+
| id  | id2  | titulo | titulo2 |
+-----+------+--------+---------+
| 482 |   13 | Crazy  | Crazy   |
+-----+------+--------+---------+

Não quero ferver a cabeça de ninguem, ja basta a minha. Mas se alguem tiver alguma outra forma de fazer ficaria grato. :D

flws gurizada!! :assobio:

Ah, em algums casos existem até 30 registro com as informações!!

Edição feita por: _AleMAuM_, 12/08/2006, 14:35.

Eu uso Zend Development Environment!

#2 djavansl

djavansl
  • Visitantes

Posted 12/08/2006, 15:48

usa o distinct

#3 _AleMAuM_

_AleMAuM_

    Turista

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

Posted 12/08/2006, 21:14

Eaw djavansl, obrigado pela ajuda! Mas distinct ajudou a reduzir um pouco a reincidencia de registros, mas nao totalmente.

Para resolver o problema tive que usar uma subquery na query, ela eliminou totalmente a reincidencia de registros, mas mata totalmente o meu computador por 6 minutos e pouco a cada vez que executo a consulta, são 26593 registro para analisar. :blink: Pode ser que o meu Mysql nao esteja configurado corretamente, ja que processador eu tenho!

Vou passar a consulta que construir e para mim funcionou perfeitamente!

SELECT 
m.id, m2.id AS id2, m.tamanho, m2.tamanho AS tamanho2, m.titulo, m2.titulo AS titulo2, 
m.diretorio, m2.diretorio AS diretorio2, a.artista, m.arquivo, m2.arquivo AS arquivo2
FROM musicas1 AS m 
LEFT JOIN musicas2 AS m2 
ON
m.titulo= m2.titulo AND m.tamanho=m2.tamanho AND m.artista = m2.artista
LEFT JOIN artistas AS a
ON 
m2.artista = a.id
WHERE m.id != m2.id AND m2.id = (
SELECT 
m3.id AS idunico 
FROM musicas1 AS m3 
LEFT JOIN musicas2 AS m4 
ON
m3.titulo= m4.titulo AND m3.tamanho=m4.tamanho AND m3.artista = m4.artista
WHERE m3.id != m4.id AND m3.tamanho = m.tamanho AND m3.titulo = m.titulo 
ORDER BY m3.id
LIMIT 0, 1
)
ORDER BY m.id

O que essa consulta simplesmente faz é, verificar se esse registro é a primeira ocorrencia da consulta, se for ele não é mostrado, resumindo, ela consegui reduzir de 30% do total dos registros para 11%. :rolleyes:

Espero que esse exemplo ajude, não sei se é o mais correto, mas funcionou perfeitamente para mim, tirando que o computador fica inutilizado por algums minutos. (y)

Flws gurizada.... :D

Edição feita por: _AleMAuM_, 12/08/2006, 21:17.

Eu uso Zend Development Environment!




1 user(s) are reading this topic

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

IPB Skin By Virteq