aiuto query mysql

  • Creatore Discussione Creatore Discussione dux86
  • Data di inizio Data di inizio

dux86

Utente Attivo
20 Lug 2007
97
0
0
Ciao ragazzi, ho un problemino che con il vostro aiuto mi potrebbe far risparmiare ore di lavoro...

il problema è il seguente:

ho creato una tabella che la riporto

CREATE TABLE IF NOT EXISTS `controllo` (
`id` int(11) DEFAULT NULL,
`data` varchar(100) DEFAULT NULL,
`time` varchar(80) DEFAULT NULL,
`accespoint` varchar(80) DEFAULT NULL,
`card` varchar(80) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Dump dei dati per la tabella `controllo`
--

INSERT INTO `controllo` (`id`, `data`, `time`, `accespoint`, `card`) VALUES
(12198, '2/6/2010', '12.11', 'entrata', '722FD4'),
(12201, '2/6/2010', '12.22', 'uscita', '722FD4'),
(12197, '2/5/2010', '11.33', 'entrata', '521F6D'),
(12206, '2/6/2010', '14.19', 'uscita', '521F6D'),
(12206, '2/6/2010', '14.19', 'uscita', '521F6D'),
(12233, '2/6/2010', '14.19', 'uscita', '521F6D'),
......
(12199, '2/6/2010', '12.12', 'entrata', '54FC89'),
(12200, '2/6/2010', '12.21', 'uscita', '54FC89'),
(12202, '2/6/2010', '13.27', 'entrata', '521ECC'),
(12203, '2/6/2010', '13.43', 'uscita', '521ECC'),
(12204, '2/6/2010', '13.54', 'entrata', '192545'),
(12205, '2/6/2010', '14.10', 'uscita', '192545'),
(12207, '2/6/2010', '15.42', 'entrata', '225115'),
(12208, '2/6/2010', '16.24', 'entrata', '192549');

ovviamente con diverse migliaia di righe... qui ne metto poche, per farvi capire meglio.

vorrei una query che mi tira fuori solo la differenza della colonna 'time'+'uscita' meno 'time'+'entrata' con la chiave primaria 'card' in base all'id' sequenziale, e in + mi tira fuori solo quelli con la differenza maggiore di 30 minuti.

ovvero, card=722FD4 --> 12.22(uscita) - 12.11(entrata) = 0.11minuti (che non va bene come risultato voluto..)

mentre
card = 521F6D --> 14.19(uscita) - 11.33(entrata) = 2 ore 26 minuti (quello che voglio io :mavieni: )
'id' accesso al varco --> 12197... 12206 deve essere in sequenza, ovvero nn mi deve fare la differenza tra:
(12233, '2/6/2010', '14.19', 'uscita', '521F6D') meno (12206, '2/6/2010', '14.19', 'uscita', '521F6D'), ma come sopra citato.



mi rendo conto che la query è quasi impossibile, ma tuttavia sperò che qualcuno c'è la fa :ilpirata:
 
Non sarà di sicuro la soluzione definitva, ma questa potrebbere essere un inizio:
Codice:
SELECT  * FROM 
(
 (
  SELECT DISTINCT STR_TO_DATE(CONCAT(data, ' ', time),'%d/%m/%Y %H.%i') as entrata, data, time, card 
  FROM `controllo` 
  WHERE accespoint = 'entrata'
 ) as t1 
 INNER JOIN 
 (
  SELECT DISTINCT STR_TO_DATE(CONCAT(data, ' ', time), '%d/%m/%Y %H.%i') as uscita, data, time, card
  FROM controllo
  WHERE accespoint = 'uscita'
 ) as t2
 ON t1.card = t2.card
)
WHERE (uscita - entrata) > 1800

Ma i dati riportati sono esempi o un estratto dei dati reali?
Perchè questi mi sembrano particolarmente strani:

(12206, '2/6/2010', '14.19', 'uscita', '521F6D'),
(12206, '2/6/2010', '14.19', 'uscita', '521F6D'),
(12233, '2/6/2010', '14.19', 'uscita', '521F6D'),

I primi due hanno addirittura lo stesso ID (la tabella non ha un chiave primaria). Mentre il terzo ha un ID diverso, ma il resto coincide con gli altri due.
A questi corrisponde poi una sola entrata:
(12197, '2/5/2010', '11.33', 'entrata', '521F6D'),
 

Discussioni simili