2011-02-01 7 views
5

Ovviamente la query nel titolo non funziona, ma potrebbe illustrare in modo ingenuo, cosa mi piacerebbe fare. Ho una tabella che contiene alcuni utenti identificati da una colonna id. Questo ID NON è univoco nel database. Segnala un utente che potrebbe avere più record nella mia tabella.ID SELECT WHERE COUNT (*)> X? - Come ottenere record da qualsiasi utente che abbia più di X record nella tabella?

Come posso visualizzare l'intero record di tutti gli utenti (identificati dall'ID) che hanno più di 10 record nella mia tabella?

risposta

5

Usa avendo invece di dove:

SELECT id 
    FROM (
     SELECT id, COUNT(*) as cnt 
     FROM sowewhere 
     GROUP BY id 
     HAVING cnt > 1 
    ) temp_table 
+0

Questo qui molto veloce e ha esattamente lo stesso risultato la mia ricerca. Anche se è più elegante, naturalmente;). Perché questa piccola differenza in HAVING causa così tanta differenza rispetto all'approccio di Ishtar? –

+0

Questo è esattamente il mio approccio, tranne il mio non ha l'istruzione SELECT aggiuntiva che lo circonda. Perché hai bisogno di SELECT in più? – anothershrubery

+0

Non ne ho bisogno, semplicemente consente di ordinare per colonne non aggregate con selezione esterna. –

0

ecco come:

CREATE TABLE mytable_clean AS 
SELECT * FROM mytable WHERE id IN(
SELECT id FROM 
(SELECT id,COUNT(*) AS appearance 
FROM mytable 
GROUP BY id) AS id_count 
WHERE id_count.appearance > 9) 

funziona. Non è per rallentare, ma mi sembra un po 'maldestro. soluzioni migliori benvenuto :)

1
SELECT id, COUNT(*) FROM Table GROUP BY id HAVING COUNT(*) > 10 
+0

Rimuovi COUNT (*) dall'inizio se si desidera solo l'ID, ma lo inserisco per mostrare il numero totale di ciascun id nella tabella. – anothershrubery

2
SELECT * FROM user 
WHERE id IN (SELECT id FROM user GROUP BY id HAVING COUNT(*) > 10) 
+0

Non so davvero perché, ma è davvero lungo rispetto al mio. –

+0

@ ran2 - lungo? Cosa intendi? Lento?? – Ishtar

+0

dannazione. Non so cosa stavo pensando quando scrissi questo. Probabilmente volevo scrivere ci vuole più tempo del mio. Buona congettura, però;) –