Ir para conteúdo
CaioMoreti

Problema com UPDATE de Tabela baseada em somatório de outra tabela [RESOLVIDO]

Recommended Posts

Saudações a todos do fórum. Como todos que começam a aprender MySQL, nos deparamos com problemas relativamente simples mas não conseguimos resolver.

 

Criei a tabela INFO_PACOTES que armazena informações de pacotes que trafegam na minha rede. Os arquivos são processados via shell e armazenados somente o MAC de origem e o tamanho do pacote.

 

mysql> desc INFO_PACOTES;
+-------------------------+-------------------+--------+------+--------------+--------+
| Field                         | Type                 | Null   | Key |    Default | Extra |
+-------------------------+-------------------+--------+------+--------------+--------+
| mac_origem           | char(17)          | YES   |         | NULL        |            |

| tamanho_frame    | decimal(5,0)   | YES   |         | NULL        |            |
+-------------------------+-------------------+--------+------+--------------+--------+

 

Como uma rede normal, diversos dispositivos são conectados e monitorados. Assim, haverão diversos dispositivos com diferentes MAC's.

 

Criei a tabela CONHECIDOS que está descrita abaixo. A única coisa que preciso é somar os valores da coluna tamanho_frame da tabela INFO_PACOTES agrupado por diferentes "mac_origem" e o resultado das somas atualizar o campo trafego_total da tabela CONHECIDOS.

 

+--------------------+---------------------+--------+------+-----------+--------+
| Field                  | Type                    | Null  | Key | Default | Extra |
+--------------------+---------------------+--------+------+-----------+--------+
| mac                   | char(17)           | NO    | PRI | NULL     |             |
|trafego_total    | decimal(20,0) | YES   |        | NULL      |             |

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

 

Crieia seguinte sentença abaixo:

 

UPDATE CONHECIDOS, INFO_PACOTES
SET trafego_total =  (SELECT sum(tamanho_frame) FROM INFO_PACOTES GROUP BY INFO_PACOTES.mac_origem)
WHERE CONHECIDOS.mac=INFO_PACOTES.mac_origem;

 

Ao final da sentença, o select resulta em mais de uma linha, gerando o erro:

ERROR 1242 (21000): Subquery returns more than 1 row

 

Alguém sabe me dizero que estou errando?

 

Obrigado!

 

Editado por CaioMoreti
Tópico Resolvido

Compartilhar este post


Link para o post
Compartilhar em outros sites

@CaioMoreti, bem-vindo ao forum!

Tente dessa forma:

UPDATE CONHECIDOS
INNER JOIN 
    (
      select mac_origem, sum(tamanho_frame) total
      from INFO_PACOTES
      group by mac_origem
    ) INFO_PACOTES
ON CONHECIDOS.mac = INFO_PACOTES.mac_origem
SET CONHECIDOS.trafego_total = INFO_PACOTES.total

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por JOSELUISALD
      Bom dia. Em minha aplicação o cliente quer uma cópia de seu sistema localmente e remoto (hospedado). Tem como eu fazer a sincronização dos bancos de dados, para que tudo que seja feito localmente seja inserido automaticamente no banco remoto? Desde já obrigado.
    • Por Caio_Lourençon
      Olá estou desenvolvendo um projeto utilizando a extensão MySQLi, e nisso aproveitando para utilizar algumas funções orientada a objeto! Gostaria de tirar umas dúvidas em relação a listagem de dados, são duas perguntas:   1) Utilizar a função foreach() ao invés de um while() com a função fetch_array() dentro, tem uma listagem mais rápida ou mais lenta? Pois com ambas consigo trazer os dados, No momento estou utilizando a foreach por ser mais rápida de se digitar.
      2) Utilizo muitas listagens de tabelas diferentes na mesma página sempre chamando um novo SELECT, seria melhor criar uma função com um SELECT dentro para eu sempre reutiliza-lá ou não iria mudar muita coisa em questão de desempenho?
       
      Agradeço qualquer informação.
    • Por gersonab
      Procuro uma revenda de hospedagem confiável, ja adianto que uolhost e locaweb estão fora dos planos.
    • Por Jefferson andre
      Ola, estou criando um contador de acessos diario mas nao funciona, a tabela tem o campo data no formato date e o campo contador int(10)
       
      A ideia eh verificar a data e se nao existir incluir na tabela, se existir adicionar ao contador
       
      Parece que o erro esta no formato da data, nem manualmente consigo incluir na tabela via localhost ou na hospedagem da google
       
      Agradeço qualquer ajuda
       
      <?php // fazendo uma conexão com o banco de dados include("conexao.php"); // grava a data atual em uma variavel date_default_timezone_set('America/Sao_Paulo'); $date = date('d-m-Y'); //$sql = "SELECT codigo FROM contador"; $resultado = $arquivo->query("SELECT data,contador FROM contador_diario WHERE data = '$date'"); if (mysqli_num_rows($resultado)== true){ // registro ja existe } else { // resultado nao encontrado entao inserir $sql = "INSERT INTO contador_diario ('data', 'contador') VALUES ('$date', '1')"; if ($arquivo->query($sql) == TRUE) { echo "Data cadastrada com sucesso"; } else { echo "Erro: " . $sql . "<br>" . $arquivo->error; } } // refaz a pesquisa para registrar o contador $resultado = $arquivo->query("SELECT data,contador FROM contador_diario WHERE data = '$date'"); // igualar a array a uma variavel $linha=mysqli_fetch_array($resultado); $cod_2 = $linha["contador"]+1; // lista a variavel //echo "<font face='Arial'><span class='style14'>$cod_2</span></font>"; $sql = "UPDATE contador_diario SET contador=$cod_2"; if ($arquivo->query($sql) === TRUE) { // echo "Alteração efetuada com sucesso"; } else { // echo "Erro alterando o contador de visitas diario" . mysqli_error($arquivo); } // fecha a conexao mysqli_close($arquivo); ?>  
    • Por gersonab
      Tenho este sql que funciona normal:
      <?php $idtor = (int)$_GET['id_tor']; $dia = $_GET['dia']; $sql3 = "SELECT * FROM cantos INNER JOIN campeonato ON id_camp = id_campeonato INNER JOIN torneio ON id_tor = id_torneio WHERE data = :dia AND id_torneio = :idtor ORDER BY cantosfim DESC, pontos DESC, cantos DESC"; $stmt = $pdo->prepare($sql3); $stmt->bindParam(':idtor', $idtor); $stmt->bindParam(':dia', $dia); $stmt->execute(); while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { ?> porém este outro não retorna nada, nem erro...
      <?php $idtor = (int)$_GET['id_tor']; $consul = "SELECT id_cantos, id_torneio, id_campeonato, SUM(cantosfim) AS cantfin, SUM(pontos) AS pontfin FROM cantos INNER JOIN campeonato ON id_camp = id_campeonato INNER JOIN torneio ON id_tor = id_torneio WHERE id_tor = :idtor ORDER BY pontfin DESC, cantfin DESC"; $stmt = $pdo->prepare($consul); $stmt->bindValue(':idtor', $idtor); $stmt->execute(); while ($lin = $stmt->fetch(PDO::FETCH_ASSOC)) { ?> não consigo encontrar o erro.
×

Informação importante

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