2012-01-24 34 views
20

Tôi có một bảng với các thông tin sau:COUNT/GROUP BY với hồ sơ hoạt động?

id | user_id | points 
-------------------------- 
1 | 12  | 48 
2 | 15  | 36 
3 | 18  | 22 
4 | 12  | 28 
5 | 15  | 59 
6 | 12  | 31 

etc. 

Những gì tôi muốn là một top 10 (mảng) với hầu hết các mục mỗi user_id (theo thứ tự từ cao xuống thấp). Vì vậy, sử dụng bảng trên, chúng tôi cần các mảng sau đổi lại:

  • 12 => 3 hàng
  • 15 => 2 hàng
  • 18 => 1 hàng
  • , vv

Làm cách nào tôi có thể thực hiện việc này với CodeIgniter bằng phương thức truy vấn bản ghi đang hoạt động? Điều này có thể được thực hiện với COUNT và GROUP BY user_id không?

Trả lời

54

Tôi tin rằng bạn sẽ muốn một cái gì đó như thế này:

$this->db->select('user_id, COUNT(user_id) as total'); 
$this->db->group_by('user_id'); 
$this->db->order_by('total', 'desc'); 
$this->db->get('tablename', 10); 

này sẽ tạo ra một kết quả như

| USER_ID | TOTAL | 
| 12 | 3 | 
| 15 | 2 | 
| 18 | 1 | 

Trong quá khứ tôi đã luôn luôn tìm thấy nó khó để biết chính xác những gì CodeIgniter là làm với các chuỗi ghi âm hoạt động của tôi. Đặc biệt là khi các chuỗi có phần phức tạp. Bài viết của bạn đã truyền cảm hứng cho tôi để tạo ra một công cụ đơn giản để hiển thị câu lệnh SQL thực tế.

Để sử dụng công cụ, chỉ cần dán vào bản ghi đang hoạt động của bạn và nhấp vào nút Gửi. Nó nên trả lại câu lệnh SQL tương ứng. Lưu ý: Tôi đã đánh thức nó khá nhanh và chưa kiểm tra kỹ lưỡng. Nó không nối với một db vì vậy một số loại truy vấn có thể dẫn đến lỗi.

Công cụ xem trước bản ghi đang hoạt động here.

CẬP NHẬT: Như một số được chỉ ra trong nhận xét, truy vấn ban đầu đã tổng hợp user_ids thay vì đếm chúng. Tôi đã cập nhật truy vấn bản ghi đang hoạt động để sửa lỗi này.

+0

Bạn cũng có thể sử dụng chức năng '$ this-> db-> last_query()' để xem những gì ghi lại hoạt động tạo ra từ các chức năng [Hướng dẫn sử dụng: Helper Query Chức năng] (http://codeigniter.com/user_guide/database/helpers.html) –

+0

Điều đó cũng hoạt động, mặc dù bạn thường cần thay đổi một loạt các cài đặt CI để nó không phát ra lỗi khi nó cố gắng chạy không hợp lệ truy vấn. –

+3

Câu trả lời này tính tổng số user_ids thay vì đếm chúng. –

2

Tôi nghĩ bạn nên đếm kết quả bằng FOUND_ROWS() and SQL_CALC_FOUND_ROWS. Bạn sẽ cần hai truy vấn: select, group_by, v.v. Bạn sẽ thêm một dấu cộng: SQL_CALC_FOUND_ROWS user_id. Sau khi truy vấn này chạy truy vấn: SELECT FOUND_ROWS(). Điều này sẽ trả về số bạn muốn.

8

Mặc dù nó là một câu trả lời cuối, tôi sẽ nói điều này sẽ giúp bạn ...

$query = $this->db 
       ->select('user_id, count(user_id) AS num_of_time') 
       ->group_by('user_id') 
       ->order_by('num_of_time', 'desc') 
       ->get('tablename', 10); 
print_r($query->result()); 
1

Mã này đếm hàng với phạm vi ngày:

Bộ điều khiển:

$this->load->model("YourModelName"); 
$data ['query'] = $this->YourModelName->get_report(); 

mẫu :

public function get_report() 
    { 
     $query = $this->db->query("SELECT * 
FROM reservation WHERE arvdate <= '2016-7-20' AND dptrdate >= '2016-10-25' "); 
     return $query; 
    } 

nơi 'arvdate' và 'dptrdate' là hai ngày trên cơ sở dữ liệu và 'đặt phòng' là tên bảng.

Xem:

<?php 
echo $query->num_rows(); 
?> 

Mã này là để trả lại số hàng. Để trả lại dữ liệu bảng, sau đó sử dụng

$query->rows(); 
return $row->table_column_name; 
0
$this->db->select('overal_points'); 
$this->db->where('point_publish', 1); 
$this->db->order_by('overal_points', 'desc'); 
$query = $this->db->get('company', 4)->result(); 
Các vấn đề liên quan