Cómo usar 'distinct' en el model zend db

He buscado durante mucho time para que esto funcione.

Lo que quiero es saber cómo utilizo el 'distinct' en un model zend db para hacer que mi selección para los seguidores de un usuario sea única.

Mi model db para contar seguidores para un usuario (aquí tengo que agregar el 'distinto')

public function countFollowers($user_id) { $rowset = $this->fetchAll("user_id = $user_id"); $rowCount = count($rowset); if ($rowCount > 0) { return $rowCount; } else { return $rowCount; } } 

EDITAR: Esta function es parte de la 'class Application_Model_DbTable_Followers extends Zend_Db_Table_Abstract'

Mi estructura de table

  • carné de identidad
  • article_id // Id del artículo que está escrito por 'user_id'.
  • user_id // user_id propietario del artículo
  • follower_id // miembro que ha seguido este artículo
  • date // date de seguimiento

'user_id' se puede escribir varios artículos, el seguidor puede seguir varios artículos del mismo escritor. Quiero hacer un recuento único de seguidores. Como un ejemplo de lo que quiero, si un seguidor está siguiendo 8 artículos de un escritor, tiene que ser comparado a '1' en el recuento.

Espero que esto sea lo suficientemente claro como para entender lo que traté de alcanzar.

Atentamente,

Nicky

Usando distinct:

 public function countFollowers($user_id) { $select = $this->select() ->distinct() ->where('user_id = ?', $user_id); $rowset = $this->fetchAll($select); $rowCount = count($rowset); return $rowCount; } 

EDITAR: Después de editar en cuestión para get el recuento de seguidores de un usuario . En realidad, necesitas usar un grupo NO distinto. He probado la siguiente consulta para recuperar los datos que se contarán () ed,

SELECCIONAR * FROM followers WHERE user_id = 1 GROUP BY user_id, follower_id

No he probado el código, pero algo así debería funcionar:

 public function countFollowers($user_id) { $select = $this->select() ->where('user_id = ?', $user_id) ->group(array('user_id', 'follower_id')); $rowset = $this->fetchAll($select); $rowCount = count($rowset); return $rowCount; } 

Puede especificar las funciones de mysql en la function 'de' que compone la function de consulta de selección. Para usar la function from, necesita pasar el nombre de la tabla como primer parámetro, sin embargo, pasar $ this (su class de model de tabla) funciona bien.

 public function countFollowers($user_id) { $rowset = $this->fetchAll( $this->select() ->from($this, array('DISTINCT user_id')) ->where('user_id = ?', $user_id) ); return count($rowset); } 

[editar]

Según su edición, 'grupo' también puede funcionar para usted:

 public function countFollowers($user_id) { $rowset = $this->fetchAll( $this->select() ->where('user_id = ?', $user_id) ->group('user_id') ); return count($rowset); } 

Esto agrupará todo el user_id coincidente en un logging. Entonces, si se encuentra un usuario, devolverá 1, sino 0.

Recuperar todas las filas simplemente para get un conteo me parece excesivo.

Puedes hacer un conteo usando algo como esto:

 $select = $db->select(); $select->from('testcount', new Zend_Db_Expr('COUNT(id)')) ->where('user_id = ?', $someUserId); return $db->fetchOne($select); 

no escribas eso:

  public function countFollowers($user_id) { $rowset = $this->fetchAll( $this->select() ->from($this, array('DISTINCT user_id')) ->where('user_id = ?', $user_id) ); return count($rowset); } 

Pero eso :

 public function countFollowers($user_id) { $rowset = $this->fetchAll( $this->select() ->from($this, array('DISTINCT(user_id)')) ->where('user_id = ?', $user_id) ); return count($rowset); } 

De lo contrario, tendrá un error que parece que Mysqli prepare el error:

Columna desconocida 'repertorio.distinct idRepertoireParent' en 'list de campo'

Hoy probé DISTINCT en el caso JOIN LEFT y no funciona. Pero si agrega un grupo por a la columna DISTINCT, funciona bien.

También tenemos un método del manual oficial

Solo usa "distinct"

Cree esta consulta: SELECCIONE DISTINCT p. "Nombre_producto" DE "productos" AS p

 $select = $db->select() ->distinct() ->from(array('p' => 'products'), 'product_name');