MySQL: selezionando i valori minimi X
-
13-09-2019 - |
Domanda
Sia una tabella come questa:
CREATE TABLE `amoreAgentTST01` (
`moname` char(64) NOT NULL DEFAULT '',
`updatetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`data` longblob,
PRIMARY KEY (`moname`,`updatetime`)
Ho una domanda per trovare i record più vecchi per ogni 'moname' distinti, ma solo se ci sono più record per questo 'moname':
SELECT moname, updatetime FROM amoreAgentTST01 a
WHERE (SELECT count(*) FROM amoreAgentTST01 x WHERE x.moname = a.moname) > 1
AND a.updatetime = (SELECT min(updatetime) FROM amoreAgentTST01 y WHERE y.moname = a.moname) ;
La mia domanda è: come fare lo stesso, ma selezionando i valori più vecchi di X? Ora è sufficiente eseguire questo, eliminare i valori più antichi e rieseguire che ... che non è così bello.
secondi domanda è: cosa ne pensi della query di cui sopra? può essere migliorato? c'è qualche cattiva pratica ovvia?
Grazie in anticipo per i vostri consigli ed aiuto.
Barth
Soluzione
Sarebbe qualcosa di simile a questo lavoro (non testata):
SELECT moname, MIN(updatetime) FROM amoreAgentTST01
GROUP BY moname HAVING COUNT(moname)>1
Modifica -. Si intende quanto sopra solo come un sostituto per il codice esistente, in modo che non risponde direttamente alla tua domanda
Credo che qualcosa di simile dovrebbe funzionare per la tua domanda principale:
SELECT moname, updatetime FROM amoreAgentTST01
GROUP BY moname, updatetime
HAVING COUNT(moname)>1
ORDER BY updatetime LIMIT 0, 10
Modifica - scusate, quanto sopra non funziona perché è il ritorno solo 10 record per tutti i monames - piuttosto che la più antica 10 per ciascuno. Dammi un think.
Un altro andare a questo (certamente, questo si guarda un po 'contorto):
SELECT a.moname, a.updatetime FROM amoreAgentTST01 a
WHERE EXISTS
(SELECT * FROM amoreAgentTST01 b
WHERE a.moname = b.moname AND a.updatetime = b.updatetime
ORDER BY b.updatetime LIMIT 0, 10)
AND (SELECT COUNT(*) FROM amoreAgentTST01 x WHERE x.moname = a.moname) > 1
Vorrei aggiungere che se c'è una colonna ID - in generale la a chiave primaria allora che dovrebbe essere utilizzato per il sub-query unisce per migliorare le prestazioni
.