Ir para conteúdo

POWERED BY:

Arquivado

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

Eduardo Pereira de Barros

Comparação de tabelas

Recommended Posts

Bom dia a todos que visitarem esse tópico, se estou aqui é porque estou ancioso por ajuda...aqui vai...

 

é o seguinte na empresa em que trabalho me solicitaram o seguinte......tenho uma tabela com os campos canal , nome canal e pacote, no codigo abaixo tenho duas querys, cada uma chamando um pacote diferente, nesse caso a primeira é o pacote atual do assinante e a segunda seria o pacote para o qual ele deseja migrar. ok pois bem, ja tentei de tudo para comparar esse dois pacotes, seria assim o usuário teria que verificar qual canais o assinante estaria perdendo ou ganhando realizando a migração de pacote, ja tentei com if, tentei unir as duas querys por uma while mas sem resultados, ai estou postando o codigo "destrinchado".....se alguém me der uma luz de como fazer essa comparação!

 

segue...

 

 

<?

include "config.php";

echo"<table border=1 align=left>
<tr>
<td>N</td>
<td>canal</td>
</tr>";

$sql = "SELECT distinct canal, nome_canal FROM grade WHERE pacote = 'COMPACTO' AND tipo ='CABO' AND tec ='DIGITAL' ORDER BY pacote";
$res = mysql_query($sql) or die (mysql_error());

while($row=mysql_fetch_array($res)){

$canal     = $row["canal"];
$nome_canal = $row["nome_canal"];


echo"<tr>
<td>$canal</td>
<td>$nome_canal</td>
</tr>";

}

echo "</table>";



echo"<table border=1 align=center>
<tr>
<td>N</td>
<td>canal</td>
</tr>";

$sql = "SELECT distinct canal, nome_canal FROM grade WHERE pacote = 'TOTAL CINEMA HD' ORDER BY pacote";
$res = mysql_query($sql) or die (mysql_error());

while($row=mysql_fetch_array($res)){

$canal1     = $row["canal"];
$nome_canal1 = $row["nome_canal"];

echo"<tr>
<td>$canal1</td>
<td>$nome_canal1</td>
</tr>";

}

echo "</table>";

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Eduardo,

 

Cara, pelo que entendi do seu código você não está fazendo nenhuma comparação e sim apenas imprimindo os conteúdos em duas tabelas, correto? Os nomes lembram bastante coisas de TV a cabo. Bom, o que você pode fazer é colocar estas 2 tabelas, lado a lado e estabelecer talvez cores diferentes para cada uma das linhas, destacando o que tem em uma e o que não tem na outra e etc. Creio que isso ajude o usuário final a visualizar o que ele está ganhando / perdendo com a adesão dos novos pacotes.

 

Outra dica: quando você colocar trechos e códigos utilize as tags de código beleza? Elas estão no editor e são identificadas por um botão com um ícone mais ou menos assim: "<>". Isso além de deixar o código com identação facilita bastante para nós do fórum interpretarmos ele, ok? ;)

 

Espero ter ajudado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

não entendi muito bem mas na segunda query se você quer excluir o que já tem na query anterior utiliza subquery, por não ter entendido talvez minha solução não seja a mais simples.

SELECT 
  distinct `canal`, 
  `nome_canal` 
FROM 
`grade` 
WHERE 
`pacote` = 'TOTAL CINEMA HD' 
AND 
`canal` NOT IN (SELECT 
					distinct `canal` 
				FROM 
					`grade` 
				WHERE 
					`pacote` = 'COMPACTO' 
				AND 
					`tipo` = 'CABO' 
				AND 
					`tec` = 'DIGITAL')
ORDER BY 
`pacote`

Compartilhar este post


Link para o post
Compartilhar em outros sites

A principio é isso mesmo......compreebdeu a idéia..... e apágina é para tv a cabo sim, "NET"..encomenda da diretoria......

 

 

então vamos la.........com aquele que você postou funciona da seguinte forma........ela só vai printar a diferença de um pacote para outro?!?!? isso.......é quase isso que eu quero........mas idéia por cores tbm ajuda........é o que seria mais fácil de identificar, sendo assim, faço uma query inversa para ambos os pacotes e faço uma if para identificar o q perde e o que ganha:?!?!

 

desde ja agradeço!

 

Victor Cometti >> agradeço o post acima mencionado mas esta me retornando esse erro : "" Operand shuold contain column(s) "";;..... o q pode ser?!?!

 

opa pera la o erro Operand eu resolvi!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode montar 2 arrays, um deles com os dados do pacote atual e outro com os dados do novo pacote e pode comparar os arrays utilizando alguma função do próprio php como o in_array.

 

A idéia do Victor também é ótima. O select dele te retornará apenas o que não existe no primeiro select, bem como disseste.

 

Em relação ao erro que você perguntou ao Victor. Provavelmente é um problema relacionado ao subselect utilizar a mesma tabela. Tente utilizar um alias para as duas tabelas, provavelmente ajude.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse erro do subselect eu ja resolvi, realmente ele esta me retornando com a diferença entre os pacotes, me perdoe aignorância mas como faço para montar esses dois arrays?.....esse é o codigo que virou com a subselect.....segue....

 

 

<?

include "config.php";


echo"<table border=1 align=left>
<tr>
<td colspan=2>COMPACTO</td>

</tr>
<tr>
<td>N</td>
<td>canal</td>
</tr>";

$sql = "SELECT distinct canal, nome_canal FROM grade WHERE pacote = 'COMPACTO' AND canal NOT IN (SELECT distinct canal FROM grade WHERE pacote = 'TOTAL CINEMA HD' AND tipo = 'CABO' AND tec = 'DIGITAL') ORDER BY pacote";
$res = mysql_query($sql) or die (mysql_error());

$count=0;

while($row=mysql_fetch_array($res)){

$canal     = $row["canal"];
$nome_canal = $row["nome_canal"];
$count++;

echo"<tr>
<td>$canal</td>
<td>$nome_canal</td>
</tr>";

}

echo "</table>";

echo"<table border=1 align=left>
<tr>
<td colspan=2>TOTAL CINEMA HD</td>

</tr>
<tr>
<td>N</td>
<td>canal</td>
</tr>";

$sql = "SELECT distinct canal, nome_canal FROM grade WHERE pacote = 'TOTAL CINEMA HD' AND canal NOT IN (SELECT distinct canal FROM grade WHERE pacote = 'COMPACTO' AND tipo = 'CABO' AND tec = 'DIGITAL') ORDER BY pacote";
$res = mysql_query($sql) or die (mysql_error());

$count=0;

while($row=mysql_fetch_array($res)){

$count++;

$pacote     = $row["pacote"];
$canal     = $row["canal"];
$nome_canal = $row["nome_canal"];


echo"<tr>
<td>$canal</td>
<td>$nome_canal</td>
</tr>";

}

echo "</table>";




?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exemplo de como fazer o array:

 

while($row=mysql_fetch_array($res)){
$arr["canal"] = $row["canal"];
$arr["nome_canal"] = $row["nome_canal"];
$array[] = $arr;
}

 

Algumas observações: no trecho abaixo você está pegando um elemento no array que não existe, no caso "pacote". Ele não está entre as colunas selecionadas da sua query, atente para isto.

 

$sql = "SELECT distinct canal, nome_canal FROM grade WHERE pacote = 'TOTAL CINEMA HD' AND canal NOT IN (SELECT distinct canal FROM grade WHERE pacote = 'COMPACTO' AND tipo = 'CABO' AND tec = 'DIGITAL') ORDER BY pacote";
$res = mysql_query($sql) or die (mysql_error());

$count=0;

while($row=mysql_fetch_array($res)){

$count++;

$pacote     = $row["pacote"];
$canal     = $row["canal"];
$nome_canal = $row["nome_canal"];

 

Aparentemente sua variável $count não está sendo utilizda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim claro......o count eu estava fazendo comparação somente, para contar os canais agregados......ok vou tentar criar os arrays.......agradeço desde ja e muito obrigado pela atenção!

 

me bato muito para fazer arrays.......ta complicado.......não utilizo muito arrays!

 

alguém pode me ajudar continuo com problemas pois só estou conseguindo vizualizar os canais que não fazem parte de grade um do outro......

Compartilhar este post


Link para o post
Compartilhar em outros sites

segue......

 

 

<?

include "config.php";


echo"<table border=1 align=left>
<tr>
<td>#</td>
<td>N</td>
<td>canal</td>
</tr>";

$sql = "SELECT distinct canal, nome_canal, pacote FROM grade WHERE pacote = 'COMPACTO' AND canal NOT IN (SELECT distinct canal FROM grade WHERE pacote = 'TOTAL CINEMA HD' AND tipo = 'CABO' AND tec = 'DIGITAL') ORDER BY pacote";
$res = mysql_query($sql) or die (mysql_error());

$count=0;

while($row=mysql_fetch_assoc($res)){

$pacote     = $row["pacote"];
$canal     = $row["canal"];
$nome_canal = $row["nome_canal"];
$count++;

echo"<tr>
<td>$count</td>
<td>$canal</td>
<td>$nome_canal</td>
</tr>";

}
echo"$pacote";
echo "</table>";

echo"<table border=1 align=left>
<tr>
<td>#</td>
<td>N</td>
<td>canal</td>
</tr>";

$sql = "SELECT distinct canal, nome_canal, pacote FROM grade WHERE pacote = 'TOTAL CINEMA HD' AND canal NOT IN (SELECT distinct canal FROM grade WHERE pacote = 'COMPACTO' AND tipo = 'CABO' AND tec = 'DIGITAL') ORDER BY pacote";
$res = mysql_query($sql) or die (mysql_error());

$count=0;

while($row=mysql_fetch_assoc($res)){

$count++;

$pacote     = $row["pacote"];
$canal     = $row["canal"];
$nome_canal = $row["nome_canal"];

echo"<tr>
<td>$count</td>
<td>$canal</td>
<td>$nome_canal</td>
</tr>";

}
echo "$pacote";
echo "</table>";




?>

 

tentei fazer os arrays mas não consegui, eu preciso imprimir as duas tabelas e setar as diferenças com cores para que o usuário possa identificar o que está sendo agregado ou perdido!

 

Obrigado!

 

Tentei fazer um union, beleza ele juntou as partes mas como fazer um if para printar os canais que não fazem parte...segue o código...

 

 

<?

include "config.php";


echo"<table border=1 align=left>
<tr>
<td>#</td>
<td>N</td>
<td>canal</td>
</tr>";

$sql = "SELECT distinct canal, nome_canal, pacote FROM grade WHERE pacote = 'COMPACTO' AND canal NOT IN (SELECT distinct canal FROM grade WHERE pacote = 'TOTAL CINEMA HD' AND tipo = 'CABO' AND tec = 'DIGITAL') ORDER BY pacote";
$sql = "UNION";
$sql = "SELECT distinct canal, nome_canal FROM grade WHERE pacote = 'COMPACTO' AND tipo ='CABO' AND tec ='DIGITAL' ORDER BY pacote";
$res = mysql_query($sql) or die (mysql_error());

$count=0;

while($row=mysql_fetch_assoc($res)){

$pacote     = $row["pacote"];
$canal     = $row["canal"];
$nome_canal = $row["nome_canal"];
$count++;

echo"<tr>
<td>$count</td>
<td>$canal</td>
<td>$nome_canal</td>
</tr>";

}
echo"$pacote";
echo "</table>";

echo"<table border=1 align=left>
<tr>
<td>#</td>
<td>N</td>
<td>canal</td>
</tr>";

$sql = "SELECT distinct canal, nome_canal, pacote FROM grade WHERE pacote = 'TOTAL CINEMA HD' AND canal NOT IN (SELECT distinct canal FROM grade WHERE pacote = 'COMPACTO' AND tipo = 'CABO' AND tec = 'DIGITAL') ORDER BY pacote";
$sql = "UNION";
$sql = "SELECT distinct canal, nome_canal FROM grade WHERE pacote = 'TOTAL CINEMA HD' AND tipo ='CABO' AND tec ='DIGITAL' ORDER BY pacote";
$res = mysql_query($sql) or die (mysql_error());

$count=0;

while($row=mysql_fetch_assoc($res)){

$count++;

$pacote     = $row["pacote"];
$canal     = $row["canal"];
$nome_canal = $row["nome_canal"];

echo"<tr>
<td>$count</td>
<td>$canal</td>
<td>$nome_canal</td>
</tr>";

}
echo "$pacote";
echo "</table>";




?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Eduardo,

 

cara, recebi sua mensagem mas não consegui responder, acho que a parte das mensagens aqui do site deve estar com um bug, sei lá :ermm:

De qualquer forma, tenta utilizar o array_dif do php (que você pode encontrar como usar aqui). Como no exemplo abaixo:

 

<?php
$array1 = array("a" => "green", "red", "blue", "red");
$array2 = array("b" => "green", "yellow", "red");
$result = array_diff($array1, $array2);

print_r($result);
?>

Que vai resultar no seguinte:

Array
(
   [1] => blue
)

 

Espero ter ajudado. ^_^

 

P.S.: Eduardo, nosso amigo Gasparzinho passou um exemplo bacana também, que você pode acessar aqui.

Compartilhar este post


Link para o post
Compartilhar em outros sites

na sua 1ª query da 1ª tentativa muda para

SELECT distinct canal, nome_canal FROM grade WHERE pacote = 'COMPACTO' AND tipo ='CABO' AND tec ='DIGITAL' ORDER BY pacote

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.