2011-03-04 8 views
5

Tengo una función que recupera todas las etiquetas de una tabla:CodeIgniter - Active Record - sql - complejo unen

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; 
} 

He otra tabla llamada 'trabajo'. La tabla 'trabajo' tiene una columna 'borrador' con valores de 1 o 0. Quiero que COUNT (etiquetas.id) tenga en cuenta si el trabajo con la etiqueta específica está en modo borrador (1) o no.

Supongamos que hay 10 trabajos etiquetados con, por ejemplo, 'diseño'. El COUNT tendrá 10. Pero 2 de estos trabajos están en modo borrador, por lo que el COUNT realmente debería ser 8. ¿Cómo manejo esto?

+1

En caso de duda, siempre se puede cambiar a vainilla SQL. – janosrusiczki

+1

Como medida de precaución, necesita alejarse del uso de selectores '*' en sus consultas, esta no es una buena práctica, siempre defina los nombres de columna que desea devolver, * NUNCA * haga 'SELECT * FROM ...' – Jakub

Respuesta

7

pruebe a cambiar:

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

Para:

$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'); 

Y agregó:

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

Gracias, pero no es la tabla de trabajo la que tiene una columna 'tag_id', es la tabla tags_to_work la que lo hace. Intenté: $ this-> db-> join ('tags_to_work AS ttw', 'work.id = ttw.work_id AND work.draft = 0'); ¡pero recibo recuentos de 33 en lugar de 1 y 66 en lugar de 2! – Jack

+0

@Jack: ¿Esto funcionaría? (Ver la publicación editada) –

+0

¡Magia, eso funciona! – Jack

2

Usted puede utilizar SQL puro en vez de utilizar la clase registro activo, yo mismo estamos trabajando con CI por más de 2 años y la mayoría de las veces evito la clase de registro activo, porque sql directo es mucho más fácil de depurar y escribir consultas complejas. Así es como lo usaría.

 
$sql = "SELECT...your sql here"; 
$q = $this->db->query($sql); 
... 
//Do something with your query here 
Cuestiones relacionadas