Ir para conteúdo

POWERED BY:

Arquivado

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

suelystonn

if/ select que não funciona

Recommended Posts

Olá pessoal, gostaria de saber porque esse if não tá funcionando.

 

Eu quero que ele selecione os dados de um blog no sistema, e ao selecionar, verifica se o mesmo blog já se encontra em outro tabela, caso ele se encontre em outra tabela, fazer um novo select para pegar um blog diferente, caso não se encontre na outra tabela, pegue os dados do blog normalmente.

 

Vejam:

$pega_blog= mysql_query("SELECT id_cadastro FROM `ativo2` WHERE creditos>='1' AND status_blog='2' AND id_cadastro NOT IN ('$suid') ORDER BY RAND() LIMIT 1") or die(mysql_error());
while($b=mysql_fetch_array($pega_blog)) {
	$id_b_t = $b["id_cadastro"];
} // pegar um blog no sistema que tenha créditos e esteja com o status 2, e que o id do blog não seja igual a variavel $suid

// script que checa se o blog que foi pego já existe em outra tabela
$pega_clicados = mysql_query("SELECT id_clicou,blog_clicado FROM blogs_clicados WHERE id_clicou = '$suid' AND blog_clicado = '$id_b_t'") or die(mysql_error());
$total_clicado = mysql_num_rows($pega_clicados);
while($bg=mysql_fetch_array($pega_clicados)) {
	$clics = $bg["blog_clicado"];
}
// agora vefica abaixo se o blog existe, se existir, seleciona outro
if($total_clicado >= 1){

$pega_blog1= mysql_query("SELECT creditos,url_blog,frame_larg,frame_alt,id_cadastro,nome_blog FROM `ativo2` WHERE creditos>='1' AND status_blog='2' AND id_cadastro NOT IN ('$id_b_t') ORDER BY RAND() LIMIT 1") or die(mysql_error());
while($bt=mysql_fetch_array($pega_blog1)) {
	$creditos = $bt["creditos"];
	$url_blog = $bt["url_blog"];
	$frame_larg = $bt["frame_larg"];
	$frame_alt = $bt["frame_alt"];
	$id_b = $bt["id_cadastro"];
	$nome_blog = $bt["nome_blog"];
}
$query = mysql_query("INSERT INTO `blogs_clicados` (id_clicou, blog_clicado) VALUES ('$suid','$id_b')") or die(mysql_error()); // insiro no banco de dados
}else{// se o blog encontra na outra tabela, então pega os dados dele
$pega_blogf= mysql_query("SELECT creditos,url_blog,frame_larg,frame_alt,id_cadastro,nome_blog FROM `ativo2` WHERE id_cadastro='$id_b_t'") or die(mysql_error());
while($bx=mysql_fetch_array($pega_blogf)) {
	$creditos = $bx["creditos"];
	$url_blog = $bx["url_blog"];
	$frame_larg = $bx["frame_larg"];
	$frame_alt = $bx["frame_alt"];
	$id_b = $bx["id_cadastro"];
	$nome_blog = $bx["nome_blog"];
}
$query = mysql_query("INSERT INTO `blogs_clicados` (id_clicou, blog_clicado) VALUES ('$suid','$id_b_t')") or die(mysql_error()); // aqui insiro no banco
}

Já tentei de varias formas, ele vai pegando os dados do blog, mais de vez em quando ele pega um que já existe na outra tabela, porque?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O objetivo é verificar se o blog já foi acessado, certo? Testaremos LEFT JOIN:

SELECT a.id_cadastro, b.id_clicou
FROM ativo2 a
LEFT JOIN blogs_clicados b ON b.blog_clicado = a.id_cadastro
WHERE b.blog_clicado IS NULL

Na teoria, essa consulta verifica se o id da tabela 'ativo2' existe na tabela 'blogs_clicados', se não fosse pelo WHERE, retornaria todos os id_cadastrado da tabela 'ativo2' e se os ids existirem na segunda tabela ('blogs_clicados') ele retorna o id_clicou, caso contrário retorna NULL. Mas especifiquei no WHERE que é para retornar somente os que não forem encontrados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@lokaodomau

 

Utilizei sua query, eu adaptei ela da seguinte forma:

$pega_blog= mysql_query("SELECT a.creditos,a.url_blog,a.frame_larg,a.frame_alt,a.id_cadastro,a.nome_blog FROM ativo2 a LEFT JOIN blogs b ON b.blog_id = a.id_cadastro WHERE b.blog_id IS NOT NULL AND a.status_blog='2' AND a.lomadee_status='2' AND a.creditos>='1' AND a.id_cadastro!='$suid' AND a.id_cadastro NOT IN (select blog_id from ips where ip_clicou='$enderecoip') ORDER BY RAND()") or die(mysql_error());

Mais ainda tem um probleminha, veja ai onde eu coloquei AND a.id_cadastro NOT IN (select blog_id from ips where ip_clicou='$enderecoip') , ou seja, selecione um blog mais que o mesmo não esteja ta tabela ips, eu faço o teste e realmente não seleciona mesmo, mais quando eu vou colocar para funcionar mesmo, as vezes ele pega um que já está na tabla ips, oque pode ser? Será porque a quantidade de registros é muito grande e o mysql erra ao verificar? pois todos os dias as 00:00 hrs a tabela e limpa e é apagado todos os registros, depois vai começando a ser inserido aos poucos, normalmente são mais de 10 mil por dia que são inseridos e depois são todos apagados.

 

Será que é o mysql que erra ao verificar a se o mesmo já consta na outra tabela por causa do grande número de registros?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que significam cada uma das outras condicionais que adicionou na query que usei de exemplo, será que alguma delas não entra em contradição com o 'b.blog_id IS NULL'?

Compartilhar este post


Link para o post
Compartilhar em outros sites

É que eu mudei algumas coisas da tabela, a query está perfeita, porém tem esse problema ai.

 

Andai analisando os registros que são inseridos e percebei que parece que as vezes o mysql insere o mesmo registro mais de uma vez em intervalos de 4 segundos, então o possível problema parece ser este, deixa eu te explicar.

 

Com a query acima eu pego um blog que esteja na tabela ativo2 e com as condições do WHERE, ou seja, pega somente se o blog estiver na tabela blogs, com creditos, status blog = 2 e lomadee_status= 2, que o id_cadastro do blog não seja igual a variavel $suid e que esteja não esteja na tabela ips.

 

Os mais de 10 mil registros diarios são inseridos na tabela ips, e as vezes quando olho tem mais de um registro com o mesmo blog_id, então parece que o problema está na query que faz a inserção dos dados na tabela ips, pois analisando a tabela, percebi que tem alguns registros repetidos que são inseridos em intervalos de 4 segundos. Todo esse problema fazia eu pensar que o problema era da query acima, onde pega os blogs.

 

O caminho a ser seguido : executa query que pega os blogs > executa query que insere os dados na tabela ips.

 

Então na verdade o query está perfeita mesmo, porque em meus testes funciona 100%, parece que o problema é da query que já insere os dados repetidos, e dessa forma eu pensava que a query que pegava os blogs era quem tava pegando o mesmo registro, ou seja, repetindo.

 

Será que você sabe alguma coisa sobre esse problema da query que insere os dados na tabela ips? pois como já falei as vezes insere o mesmo registros mais de uma vez em intervalos de 4 segundos. Essas duas querys são executados a partir do momento quer usuarios fazem alguns procedimentos em meu site e são vários usuarios ao mesmo tempo, dessa forma penso eu que é o mysql que não ta aguentando.

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.