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

È stato utile?

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

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top