2011-03-04 39 views
5

Tôi có một chức năng để lấy tất cả các thẻ từ một bảng:CodeIgniter - kỷ lục hoạt động - sql - phức tạp tham gia

function global_popular_tags() { 
    $this->db->select('tags.*, COUNT(tags.id) AS count'); 
    $this->db->from('tags'); 
    $this->db->join('tags_to_work', 'tags.id = tags_to_work.tag_id'); 
    $this->db->group_by('tags.id'); 
    $this->db->order_by('count', 'desc'); 
    $query = $this->db->get()->result_array(); 
    return $query; 
} 

tôi đã bàn nhau gọi là 'công việc'. Bảng 'work' có cột 'draft' với các giá trị bằng 1 hoặc 0. Tôi muốn COUNT (tags.id) xem xét liệu tác phẩm có thẻ cụ thể có ở chế độ nháp (1) hay không.

Giả sử có 10 tác phẩm được gắn thẻ, ví dụ: 'thiết kế'. COUNT sẽ là 10. Nhưng 2 trong số các tác phẩm này ở chế độ nháp, vì vậy COUNT thực sự phải là 8. Tôi làm cách nào để quản lý việc này?

+1

Khi nghi ngờ bạn luôn có thể chuyển sang vani SQL. – janosrusiczki

+1

Để phòng ngừa, bạn cần tránh sử dụng bộ chọn '*' trong các truy vấn của bạn, đây không phải là thực hành tốt, luôn xác định tên cột bạn muốn trả về, * KHÔNG BAO GIỜ * làm 'CHỌN * TỪ ...' – Jakub

Trả lời

7

Hãy thử thay đổi:

$this->db->from('tags'); 
$this->db->join('tags_to_work', 'tags.id = tags_to_work.tag_id'); 

Để:

$this->db->from('tags, work'); 
$this->db->join('tags_to_work', 'tags.id=tags_to_work.tag_id AND work.id=tags_to_work.work_id'); 

Và Thêm:

$this->db->where('work.drafts', 0); 
+0

Cảm ơn, nhưng nó không phải là bảng làm việc có cột 'tag_id', đó là bảng tags_to_work thực hiện. Tôi đã thử: $ this-> db-> join ('tags_to_work AS ttw', 'work.id = ttw.work_id AND work.draft = 0'); nhưng tôi nhận được 33 số thay vì 1, và 66 thay vì 2! – Jack

+0

@Jack: Tính năng này có hoạt động không? (Xem bài viết đã chỉnh sửa) –

+0

Magic, hoạt động! – Jack

2

Bạn có thể sử dụng sql tinh khiết thay vì sử dụng các lớp kỷ lục hoạt động, bản thân tôi đang làm việc với CI trong hơn 2 năm và hầu hết thời gian tôi đang tránh các lớp bản ghi hoạt động, gây ra sql thẳng là dễ dàng hơn nhiều để gỡ lỗi và viết các truy vấn phức tạp. Đây là cách tôi sẽ sử dụng nó.

 
$sql = "SELECT...your sql here"; 
$q = $this->db->query($sql); 
... 
//Do something with your query here 
Các vấn đề liên quan