Ir para conteúdo

POWERED BY:

Arquivado

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

Emerson Luiz

UPDATE com SELECT

Recommended Posts

Amigos,

 

Estou com o seguinte problema:

 

Estou fazendo a consulta e insert de uma tabela em outra... e esta OK.

Segue a sintaxe:

 

INSERT INTO ramais_total (ramais, total);
SELECT src AS ramais, count(src) AS total FROM vw_cdr
WHERE disposition = 'ANSWERED'
GROUP BY src ORDER BY total DESC;
A sintaxe acima faz o seguinte:
Ela pega todo o conteúdo da coluna SRC da tabela vw_cdr e conta. o SELECT retorna algo como:
+--------+-------+
| ramais | total |
+--------+-------+
| 98339 | 6 |
| 70986 | 3 |
+--------+-------+
2 rows in set (0,02 sec)
Ele mostra o número de ligações atendidas por cada ramal q existir no banco.
Porem, a tabela vw_cdr é atualizada constantemente, então tentei um UPDATE sem sucesso:
UPDATE ramais_total
SET
ramais = (SELECT src FROM vw_cdr
WHERE disposition = 'ANSWERED' AND ramais = src
ORDER BY src ),
total = (SELECT count(1) FROM vw_cdr
WHERE disposition = 'ANSWERED'
GROUP BY src ORDER BY total DESC)
WHERE ramais = ramais;
Ele retorna o seguinte erro:

Subquery returns more than 1 row

Alguém pode me ajudar com esse problema?

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
UPDATE ramais_total rt ,
(SELECT src ramais, count(*) total FROM vw_cdr
WHERE disposition = 'ANSWERED'
GROUP BY src) rs
set
rt.total = rs.total
where rt.ramais = rs.ramais

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gista,

 

FUNCIONOU redondo.. Muito Obrigado

 

Pode me explicar pq vc criou a variavel 'rt'?

Pelo que eu vi, ela é o segredo....

 

Só tenho um novo problema agora...

 

Quando entra novos RAMAIS, ele não são inclusos com o UPDADE, temo como rodar um INSERT antes para conferir se tem novos ramais ?

 

Muito obrigado mesmo pela ajuda...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade antes vc estava fazendo algo que nao fazia sentido e sua sorte foi ter nao rodado, pq senao encheria a tabela de dados errados , pois vc nao demonstrou a relacao entre o ramal e o total de ligações.

 

O que eu fiz foi criar uma consulta com os dados totalizados e usa-la como tabela e essa tabela virtual eu chanei de "rs", algo totalmente factivel. "rt" foi só um alias para eu escrever menos. a consulta poderia ter sido tmb:

 

UPDATE ramais_total,
(SELECT src ramais, count(*) total FROM vw_cdr
WHERE disposition = 'ANSWERED'
GROUP BY src) rs
set
ramais_total.total = rs.total
where ramais_total.ramais = rs.ramais
Quanto ao seu problema eu nao sei exatamente o que vc quer fazer, se vc explicar a logica do que vc pretende fazer eu posso tentar ajudar.
Um abraço, fico feliz em poder ter te ajudado :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Giesta,

 

O que preciso fazer é os seguinte:

 

CENRARIO:

 

A tabela vw_cdr contem os seguintes dados que eu preciso consultar:

 

mysql> SELECT src, disposition FROM vw_cdr LIMIT 10;
+------------+-------------+
| src | disposition |
+------------+-------------+
| 3491267188 | ANSWERED |
| 98339 | NO ANSWER |
| 98339 | NO ANSWER |
| 98339 | NO ANSWER |
| 98339 | ANSWERED |
| 98339 | NO ANSWER |
| 98339 | NO ANSWER |
| 98339 | BUSY |
| 98339 | NO ANSWER |
| 98339 | FAILED |
+------------+-------------+
10 rows in set (0,01 sec)
Essa tabela não para de crescer. Ela armazena informações das ligações realizadas pelos usuários.
SRC = Ramal do usuário.
DISPOSITION = Status da ligações, se foi ATENDIDA por exemplo. Por esse motivo temos o SRC repetido N vezes.
Com o código abaixo, eu consigo ler e contar e armazenar em outra esse dados na tabela vw_cdr:
INSERT INTO ramais_total (ramais, total);
SELECT src AS ramais, count(src) AS total FROM vw_cdr
WHERE disposition = 'ANSWERED'
GROUP BY src ORDER BY total DESC;
Com o codigo que vc ajudou, eu consigo agora ATUALIZAR a contagem dos ramais já presentes na tabela ramais_total que foi inseridos com o código acima.
Porem, essa tabela recebe novos ramais sempre, e então esse não sao atualizados com o UPDADE, se eu repetir o INSERT ele insere os novos, bem como DUPLICA os já existentes.
Preciso agora criar um INSERT que insira os ramais que não estão presentes na tabela, sem que seja duplicados os já existentes.
Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites
caso na tabela ramais_totais você coloque ou tenha uma chave no campo ramais


-> alter table ramais_totais add primary key (ramais)


você pode usar a query abaixo pra manter a tabela atualizada:


replace INTO ramais_total (ramais, total);

SELECT src AS ramais, count(src) AS total FROM vw_cdr

WHERE disposition = 'ANSWERED'

GROUP BY src


o replace seria algo como atualiza os que ja tem e insere os que ainda nao tem


Mas o ideal mesmo na minha opniao seria a criação de uma view, assim SEMPRE os dados estariam atualizados e pode usar a view como uma tabela




Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou enfrentando problema de performance com views... Por isso estou buscando outra alternativa.

 

O comando REPLACE funcionou, porem ele repetiu os dados no ID 2 e 11 conforme abaixo:

 

mysql> SELECT * FROM ramais_total;
+----+------------+-------+
| id | ramais | total |
+----+------------+-------+
| 2 | 98339 | 2376 |
| 3 | 26443 | 1 |
| 4 | 28072 | 7 |
| 5 | 3135278000 | 23 |
| 6 | 3138899258 | 8 |
| 7 | 3438121125 | 3 |
| 8 | 3491267188 | 2 |
| 9 | 70986 | 20 |
| 10 | 82297 | 64 |
| 11 | 98339 | 2376 |
+----+------------+-------+

10 rows in set (0,00 sec)

 

Ele inseriu o que já existia.

 

Obrigado pela ajuda...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Emerson Luiz , sem acessar o seu banco, só vendo a plotagem de dados já da pra ver que o segundo 98339 tem um espaço :P , ai são dois dados diferentes rs, se você corrigir a inadequação dos seus dados fica redondinho .

 

Além disso vc criou a chave no campo para impedir repetições?

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.