2012-08-22 41 views
22

Hãy nói rằng bạn có bảng sau (cột quan tâm ở đây là cid):MySQL Chọn hàng trên xuất hiện đầu tiên của mỗi giá trị duy nhất

+-----+-------+-------+-------+---------------------+--------------+ 
| 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 | 
+-----+-------+-------+-------+---------------------+--------------+ 

Làm thế nào để giải nén chỉ sự xuất hiện đầu tiên của mỗi cid? Bảng kết quả sẽ là:

+-----+-------+-------+-------+---------------------+--------------+ 
| 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 :)  | 
+-----+-------+-------+-------+---------------------+--------------+ 

Trả lời

43

mysql có một "ăn gian" cho việc này:

select * 
from mytable 
group by cid; 

Đó là tất cả bạn cần, bởi vì trong mysql nó cho phép bạn không tổng hợp các cột không theo nhóm (cơ sở dữ liệu khác sẽ ném một lỗi cú pháp), trong trường hợp đó, nó chỉ xuất hiện lần đầu tiên của mỗi gr oup theo giá trị. Lưu ý rằng mặc dù điều này sẽ không đảm bảo cách trong đó "đầu tiên" xảy ra được xác định (nó sẽ là như thế nào các hàng được đọc trong)

Nếu bạn muốn có một đặc biệt xuất hiện đầu tiên, sắp xếp đầu tiên, sau đó áp dụng các nhóm bằng cách cheat:

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

tôi cần thêm 'Sắp xếp theo thời gian DESC' để có được nó được sắp xếp với hầu hết gần đây ở phía trên, nhưng nếu không điều này có vẻ như được làm việc như mong đợi. Sheesh, nhanh quá. Cảm ơn! – TPoy

+0

@Bohemian, bạn có thể cho tôi biết điều gì có nghĩa là ** 'x' ** trước __GAMES_VN__VN? –

+1

@carlos tất cả các truy vấn phụ phải được cung cấp bí danh, ngay cả khi bạn không đề cập đến nó. Đó là một yêu cầu của cú pháp SQL. Tôi thường sử dụng "x" như than ôi nếu tôi không thực sự sử dụng nó. Bạn có thể thay đổi "x" thành bất kỳ thứ gì bạn muốn và truy vấn sẽ vẫn hoạt động, nhưng bạn không thể bỏ nó ra hoàn toàn – Bohemian

1

Bạn có thể sử dụng một bộ lọc tham gia:

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

Hãy thử thế này,

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

tôi biết đó là một chủ đề cũ, giải pháp chỉ được chấp nhận sẽ lấy cho tôi những collumns rằng có nhiều hơn một OCC urence. Điều này làm việc cho tôi:

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

Các vấn đề liên quan