Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ThiagoLimah

[Resolvido] RAND() não funciona com UNION

Recommended Posts

Dae pessoal, estou penando para descobrir o problema desse SQL.

 

O que preciso fazer, preciso buscar todos os clientes em uma busca, mas preciso fazer com que os Anunciantes venham antes dos Não-Anunciantes. Mas preciso fazer também com que os Anunciantes venham de forma aleatória.

 

Estou tentando buscar primeiramente os Anunciantes usando a função RAND() no ORDER BY e dando um UNION com o SQL que busca os Não-Anunciantes.

 

Segue SQL:

 

 (
  SELECT app_clientes.nome AS nome, app_clientes.razaosocial AS razaosocial,
         app_clientes.codigo AS codigo, app_clientes.classificacao AS classificacao 
     FROM `app_clientes`  
     WHERE app_clientes.nome LIKE '%a%' AND app_clientes.classificacao = 'Anuciante' 
     ORDER BY RAND()
 ) UNION (
  SELECT app_clientes.nome AS nome, app_clientes.razaosocial AS razaosocial,
         app_clientes.codigo AS codigo, app_clientes.classificacao AS classificacao 
     FROM `app_clientes`  
     WHERE app_clientes.nome LIKE '%a%' AND app_clientes.classificacao != 'Anuciante'
 )

 

Só que desta forma o RAND() não está trazendo os Anunciantes de forma aleatória. Se alguém puder me ajudar ou me dar uma dica.

 

Desde já valeu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

mysql> SELECT FLOOR(0 + (RAND() * 5)) UNION SELECT FLOOR(0 + (RAND() * 5)) UNION SELECT FLOOR(0 + (RAND() * 5));

+-------------------------+

| FLOOR(0 + (RAND() * 5)) |

+-------------------------+

| 1 |

| 2 |

| 4 |

+-------------------------+

3 rows in set (0.00 sec)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu sei que o RAND() funciona mas nesse caso um dos SELECT não possui RAND(), não sei se isso tem ligação mas o que acredita estar errado no SQL que passei?

 

Att

Compartilhar este post


Link para o post
Compartilhar em outros sites

tem alguma coisa estranha.

 

Vamos ver o tipo de select, se o rand está sendo executado... utilize o EXPLAIN. O EXPLAIN retorna uma linha de informação para cada tabela utilizada na instrução SELECT. As tabelas são listadas na ordem em que o MySQL lê os dados, durante o processamento da consulta.

 

(

EXPLAIN

  SELECT app_clientes.nome AS nome, app_clientes.razaosocial AS razaosocial,
         app_clientes.codigo AS codigo, app_clientes.classificacao AS classificacao 
     FROM `app_clientes`  
     WHERE app_clientes.nome LIKE '%a%' AND app_clientes.classificacao = 'Anuciante' 
     ORDER BY RAND()
 ) UNION (
  SELECT app_clientes.nome AS nome, app_clientes.razaosocial AS razaosocial,
         app_clientes.codigo AS codigo, app_clientes.classificacao AS classificacao 
     FROM `app_clientes`  
     WHERE app_clientes.nome LIKE '%a%' AND app_clientes.classificacao != 'Anuciante'
 )

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara eu não conheço essa função, rodei o SQL e retornou esse erro.

 

#1064 - 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 'EXPLAIN SELECT app_clientes.nome AS nome, app_clientes.razaosocial AS razaos' at line 3

 

Acredito que seja sintaxe mas não sei.

 

Se eu rodo somente o primeiro SQL o RAND() funciona perfeitamente, mas com o union não.

 

Se uso o explain antes do select retorna isso:

 

 

id select_type table type possible_keys key key_len ref rows Extra

1 SIMPLE app_clientes ALL NULL NULL NULL NULL 3 Using where; Using temporary; Using filesort

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas se o problema for esse eu terei outro problema porque é um sistema de busca, onde eu preciso pesquisar por string Alaerte Gabriel.

 

Executei o seguinte SQL e o resultado foi o mesmo, ele não traz o primeiro SELECT de forma aleatória.

 

(
SELECT app_clientes.nome AS nome, app_clientes.razaosocial AS razaosocial, app_clientes.codigo AS codigo,          app_clientes.classificacao AS classificacao
FROM  `app_clientes` 
WHERE app_clientes.classificacao =  'Anuciante'
ORDER BY RAND( )
)
UNION (

SELECT app_clientes.nome AS nome, app_clientes.razaosocial AS razaosocial, app_clientes.codigo AS codigo, app_clientes.classificacao AS classificacao
FROM  `app_clientes` 
WHERE app_clientes.classificacao !=  'Anuciante'
)

 

Nossa, minha cabeça está doendo já! haushaus

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se da problema quando tu adiciona o union o problema está na segunda parte do código... realmente nada haver com o link. eu não vejo erro em seu código...

 

troque o comparador lógico de "!=" para "<>"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Essa é a pergunta que não quer calar... tem maneira mais fácil, como por exemplo 2 selects mas vamos ver a finalidade/necessidade dele :upset:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Unindo meu código fica mais limpo, não teria a necessidade de percorrer dois resultados diferentes, e sim somente um né! Mas já estou desistindo, vou ter que separar os selects mesmo.

 

=(

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faça o seguinte, vamos diferenciar o ALIAS

 

(
SELECT app_clientes.nome AS nome, app_clientes.razaosocial AS razaosocial, app_clientes.codigo AS codigo,          app_clientes.classificacao AS classificacao
FROM  `app_clientes` 
WHERE app_clientes.classificacao =  'Anuciante'
ORDER BY RAND( )
)
UNION (

SELECT app_clientes.nome AS nome2, app_clientes.razaosocial AS razaosocial2, app_clientes.codigo AS codigo, app_clientes.classificacao AS classificacao2
FROM  `app_clientes` 
WHERE app_clientes.classificacao <> 'Anuciante'
)

 

Na exibição, adicione os nomes com o 2 no final, entendeu ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alaerte Gabriel, testei e continua sem funcionar cara, sinceramente estou desistindo, preciso entregar pro cliente isso funcionando amanhã! ahsuhahuas

 

Vou separar os SELECTs mesmo pessoal, valeu a ajuda de vocês!

=)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não deveria haver um LIMIT? Bem... Segue uma alternativa:

 

Tente assim:

 

select * from (
  SELECT app_clientes.nome AS nome, app_clientes.razaosocial AS razaosocial,
         app_clientes.codigo AS codigo, app_clientes.classificacao AS classificacao 
     FROM `app_clientes`  
     WHERE app_clientes.nome LIKE '%a%' AND app_clientes.classificacao = 'Anuciante' 
     ORDER BY RAND())
union
select * from (
  SELECT app_clientes.nome AS nome, app_clientes.razaosocial AS razaosocial,
         app_clientes.codigo AS codigo, app_clientes.classificacao AS classificacao 
     FROM `app_clientes`  
     WHERE app_clientes.nome LIKE '%a%' AND app_clientes.classificacao != 'Anuciante'
 ) 

 

----

 

Editado: Valeu nada, agora tu vai testar esse bizarrice!!! Rs :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

#1248 - Every derived table must have its own alias

 

Certo, faça assim:

 

select * from (
  SELECT app_clientes.nome AS nome, app_clientes.razaosocial AS razaosocial,
         app_clientes.codigo AS codigo, app_clientes.classificacao AS classificacao 
     FROM `app_clientes`  
     WHERE app_clientes.nome LIKE '%a%' AND app_clientes.classificacao = 'Anuciante' 
     ORDER BY RAND()) temp1
union
select * from (
  SELECT app_clientes.nome AS nome, app_clientes.razaosocial AS razaosocial,
         app_clientes.codigo AS codigo, app_clientes.classificacao AS classificacao 
     FROM `app_clientes`  
     WHERE app_clientes.nome LIKE '%a%' AND app_clientes.classificacao != 'Anuciante'
 ) temp2

 

Agora vai! :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aeeeee Prog, funcionou o RAND() cara!!!

 

Tu é fera mano, valeu mesmo! :clap:

Vocês são feras, agradeço a ajuda de todos, valeu mesmo! =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.