2012-08-22 6 views
22

Digamos que usted tiene la siguiente tabla (la columna de interés aquí es cid):MySQL seleccionar filas en la primera aparición de cada valor único

+-----+-------+-------+-------+---------------------+--------------+ 
| cid | pid | rid | clink | time    | snippet  | 
+-----+-------+-------+-------+---------------------+--------------+ 
| 155 | 11222 | 1499 | 1137 | 2012-08-22 03:05:06 | hi   | 
| 138 | 11222 | 241 | 1136 | 2012-08-21 05:25:00 | again  | 
| 138 | 11222 | 241 | 1135 | 2012-08-21 05:16:40 | hi   | 
| 155 | 11222 | 1499 | 1134 | 2012-08-21 05:11:00 | hi cute  | 
| 140 | 11222 | 11223 | 1133 | 2012-08-21 05:05:18 | hi   | 
| 154 | 11222 | 565 | 1132 | 2012-08-21 05:04:47 | 7   | 
| 153 | 11222 | 272 | 1131 | 2012-08-21 05:04:41 | 6   | 
| 146 | 11222 | 362 | 1130 | 2012-08-21 05:04:33 | 5   | 
| 152 | 11222 | 364 | 1129 | 2012-08-21 05:04:27 | 4   | 
| 151 | 11222 | 390 | 1128 | 2012-08-21 05:04:22 | 3   | 
| 150 | 11222 | 333 | 1127 | 2012-08-21 05:04:16 | 2   | 
| 148 | 11222 | 268 | 1126 | 2012-08-21 05:04:10 | 1   | 
| 140 | 11222 | 11223 | 1125 | 2012-08-21 04:59:57 | hi sir  | 
| 147 | 11222 | 283 | 1123 | 2012-08-21 03:29:55 | yo   | 
| 140 | 11222 | 11223 | 1121 | 2012-08-21 02:12:13 | hello!  | 
| 139 | 11222 | 249 | 1120 | 2012-08-21 02:11:53 | hi :)  | 
| 140 | 11222 | 11223 | 1119 | 2012-08-21 02:11:26 | hi :)  | 
| 140 | 11222 | 11223 | 1118 | 2012-08-21 02:11:08 | hi too  | 
| 139 | 11222 | 249 | 1117 | 2012-08-21 02:11:00 | :P   | 
| 139 | 11222 | 249 | 1116 | 2012-08-21 02:10:57 | hi   | 
| 139 | 11222 | 249 | 1115 | 2012-08-21 02:10:51 | helo   | 
| 139 | 11222 | 249 | 1114 | 2012-08-21 02:06:19 | hi   | 
| 139 | 11222 | 249 | 1113 | 2012-08-21 02:05:45 | hi baby  | 
| 139 | 11222 | 249 | 1112 | 2012-08-21 02:05:00 | hi   | 
| 139 | 11222 | 249 | 1111 | 2012-08-21 02:04:41 | hi   | 
| 140 | 11222 | 11223 | 1110 | 2012-08-21 02:04:26 | hi   | 
| 140 | 11222 | 11223 | 1108 | 2012-08-21 01:47:40 | hey :)  | 
| 139 | 11222 | 249 | 1107 | 2012-08-21 01:44:43 | hi   | 
| 138 | 11222 | 241 | 1106 | 2012-08-21 01:44:11 | hi   | 
| 138 | 11222 | 241 | 1105 | 2012-08-21 01:09:20 | conv 1 msg 1 | 
+-----+-------+-------+-------+---------------------+--------------+ 

cómo extraer sólo la primera aparición de cada cid? La tabla resultante sería:

+-----+-------+-------+-------+---------------------+--------------+ 
| cid | pid | rid | clink | time    | snippet  | 
+-----+-------+-------+-------+---------------------+--------------+ 
| 155 | 11222 | 1499 | 1137 | 2012-08-22 03:05:06 | hi   | 
| 138 | 11222 | 241 | 1136 | 2012-08-21 05:25:00 | again  | 
| 140 | 11222 | 11223 | 1133 | 2012-08-21 05:05:18 | hi   | 
| 154 | 11222 | 565 | 1132 | 2012-08-21 05:04:47 | 7   | 
| 153 | 11222 | 272 | 1131 | 2012-08-21 05:04:41 | 6   | 
| 146 | 11222 | 362 | 1130 | 2012-08-21 05:04:33 | 5   | 
| 152 | 11222 | 364 | 1129 | 2012-08-21 05:04:27 | 4   | 
| 151 | 11222 | 390 | 1128 | 2012-08-21 05:04:22 | 3   | 
| 150 | 11222 | 333 | 1127 | 2012-08-21 05:04:16 | 2   | 
| 148 | 11222 | 268 | 1126 | 2012-08-21 05:04:10 | 1   | 
| 147 | 11222 | 283 | 1123 | 2012-08-21 03:29:55 | yo   | 
| 140 | 11222 | 11223 | 1121 | 2012-08-21 02:12:13 | hello!  | 
| 139 | 11222 | 249 | 1120 | 2012-08-21 02:11:53 | hi :)  | 
+-----+-------+-------+-------+---------------------+--------------+ 

Respuesta

43

MySQL tiene una "trampa" para esto:

select * 
from mytable 
group by cid; 

Eso es todo lo que necesita, ya que en mysql le permite no agregar las columnas no agrupadas por (otras bases de datos arrojarían un error de sintaxis), en cuyo caso solo muestra la primera aparición de cada gr valor (es) de oup-by. Ten en cuenta que esto no garantiza la manera en la que se determina la "primera" aparición (que será igual forma las filas se leen)

Si quieres una primera aparición en particular , ordenar primero, a continuación, aplicar el grupo por tramposo:

select * 
from (
    -- order by the "time" column descending to get the "most recent" row 
    select * from mytable order by time desc 
    ) x 
group by cid 
+6

que tenía que añadir 'ORDER BY DESC' tiempo para que lo solucionó con la más reciente en la parte superior, pero por lo demás parece estar funcionando como se esperaba. Sheesh, eso fue rápido. ¡Gracias! – TPoy

+0

@Bohemian, ¿puedes decirme qué significa ** ** x 'antes de _GROUP BY_? –

+1

@carlos todas las subconsultas deben tener un alias, incluso si no se refiere a él. Es un requisito de la sintaxis SQL. Usualmente uso "x" como alas si no voy a usarlo realmente. Puedes cambiar "x" a casi todo lo que desees y la consulta seguirá funcionando, pero no puedes dejarla de lado – Bohemian

1

Se puede usar un filtrado Ingreso:

select * 
from (
     select cid 
     ,  min(time) as min_time 
     from YourTable 
     group by 
       cid 
     ) filter 
join YourTable yt 
on  filter.cid = yt.cid 
     and filter.min_time = yt.time 
3

intente éste,

SELECT * 
FROM tableName a 
     INNER JOIN 
     (
     SELECT cid, MIN(`time`) MinTime 
     FROM tableName 
     GROUP BY cid 
     ) b ON a.CID = B.cid AND 
      a.time = b.MinTime 
0

sé que es un hilo de edad, la solución aceptada sólo me recuperaría los collumns que tenían más de un OCC urence. Esto funcionó para mí:

SELECT cid,pid,rid,clink,max(time),snippet FROM mytable GROUP BY cid

Cuestiones relacionadas