Ajuda em Select

(leandroauler) #1

Galera,

Tenho a seguinte tabela passageiros:

Id
Data
Hora (Segundos)
Motorista
NumeroCartao
Aplicacao
AplicacaoEmissor

Preciso fazer um select onde a Quantidade de utilização do Cartão com o mesmo motorista seja Maior que 3 vezes.

Fiz o seguinte select:

SELECT
COUNT(*) AS Quantidade,
g.Id,
g.Data,
gp.Data,
sec_to_time(g.Hora) AS HORARIO,
g.NumeroCartao,
gp.NumeroCartao,
g.Motorista,
gp.Motorista
FROM
passageiros p, passageiros gp
WHERE
g.Data Between '2009-09-01' AND '2009-09-01' AND 
gp.Data Between '2009-09-01' AND '2009-09-01' AND
g.NumeroCartao = gp.NumeroCartao AND
g.Motorista = gp.Motorista
GROUP BY g.NumeroCartao HAVING Quantidade > 3

Além da query está lenta está duplicando os resultados…

Alguém sabe como me ajudar???

(Diogo Toscano) #2

http://www.electrictoolbox.com/mysql-group-by-having/

(leandroauler) #3

Diogo,

Você viu algum erro na query?

(Marco Sabo) #4

“FROM
passageiros p, passageiros gp”

Não seria “g”

(leandroauler) #5

Marco,

Errei na hora de escrever aqui no forum mas no amiente de produção está correto… Valeu pela dica…

(belgadata) #6

SELECT
COUNT(*) AS Quantidade,
g.Id,
g.Data,
gp.Data,
sec_to_time(g.Hora) AS HORARIO,
g.NumeroCartao,
gp.NumeroCartao,
g.Motorista,
gp.Motorista
FROM
passageiros p, passageiros gp
WHERE
g.Data Between ‘2009-09-01’ AND ‘2009-09-01’ AND
gp.Data Between ‘2009-09-01’ AND ‘2009-09-01’ AND
g.NumeroCartao = gp.NumeroCartao AND
g.Motorista = gp.Motorista
GROUP BY g.NumeroCartao HAVING Quantidade > 3

Bom dia, Leandro
1 - Os registros estão duplicando porque voce usou a mesma tabela no FROM
" FROM passageiros p, passageiros gp ". Porque ?
2- O campos do WHERE devem ter indices e do GROUP BY para melhorar a performance.
Utilizar "Between " tambem degrada a performance, use "g.Data > ‘2009-09-01’ AND g.Data < ‘2009-09-01’ ". Se for a mesma data , como exemplo acima, use 'g.data=‘2009-09-01’ "
3 - os campo do SELECT devem ser os mesmos do GROUP BY e mais os de totalização/agregacao (SUM,COUNT …)

Abraços !

(leandroauler) #7

Belgadata,

Obrigado pelas dicas, mas não estou conseguindo ver uma forma de fazer esse select…
Tenho que fazer o select onde so me mostre os Cartões que foram utilizados mais de 3 vezes com o mesmo motorista num determinado dia.

Eexemplo:
Id Data Horario Cartao Motorista
1 01/09/2010 07:12 12345678 123123
2 01/09/2010 07:45 12345678 100100
3 01/09/2010 09:00 12345678 100100
4 01/09/2010 11:12 12345678 100100
5 01/09/2010 15:12 12345678 100100
6 01/09/2010 18:12 12345678 123456

(belgadata) #8

Ok, amigo execute a query
SELECT Motorista,NumeroCartao, count(*) as Quantidade

FROM passageiros

WHERE Data = ‘2009-01-01’

ORDER BY Motorista,NumeroCartao

GROUP BY Motorista,NumeroCartao

HAVING count(*) > 3

(Diogo Toscano) #9

foi por isso q coloquei o link de group by e having …

(leandroauler) #10

Vou testar e informo o resultado…

(leandroauler) #11

Entendi, tava criando uma query complicada para uma coisa simples…

(leandroauler) #12

Belgadata / Diogo

Funcionou perfeitamente… Obrigado

(rayfcrols) #13

Pessoal eu estou com um problema que não consigo resolver tenho que montar uma consulta em que somente liste os itens que se encontram em uma outra tabela. Vou tentar explicar:

TABELA1
cod_doc, titulo_cod, descricao_doc
1 Titulo1 Descrição1
2 Titulo2 Descrição2
3 Titulo3 Descrição3
4 Titulo4 Descrição4
5 Titulo5 Descrição5

TABELA2
cod_mov, cod_doc, status_mov
1 1 OK
1 3 FALTA
1 5 OK

Basicamente eu quero dar um select que liste somente os itens que constam na TABELA2 e que o cod_mov seja “tal”…

(leandroauler) #14

Ray

select t1.cod_doc, t1.titulo_cod,  t1.descricao_doc FROM tabela1 t1 WHERE cod_doc EXISTS (Select * FROM tabela2 where cod_doc = t1.cod_doc)
(Haroldo) #15

select campos from tabela in where campo in (select campo from tabela2 where condição)