Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
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
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'
)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
Bom, eu creio que o problema está em sua clausula where expecificamente no LIke. Tente apontar IDs fixos, e me diga.
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
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 "<>"
Afinal... Pq você precisa unir os resultados?
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:
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.
=(
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 ?
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!
=)
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
A princípio não quero limitar!
Bom, rodei teu teste e: #1248 - Every derived table must have its own alias
haha
>
#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
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! =)
Boa solução :clap:
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)