2011-07-18 21 views
7

Bu şeyin işe yaraması için uzun zamandır arama yaptım.Zend db modelinde 'farklı' nasıl kullanılır?

İstediğim şey, bir kullanıcının benzersiz takipçileri için seçimimi yapmak için bir zend db modelinde 'farklı' özelliğini nasıl kullandığımı bilmek.

Benim db modeli (I 'ayrı' eklemeniz gerekir burada) bir kullanıcı için

public function countFollowers($user_id) 
{  
    $rowset  = $this->fetchAll("user_id = $user_id"); 
    $rowCount  = count($rowset); 

    if ($rowCount > 0) { 
     return $rowCount; 
    } else { 
     return $rowCount; 
    } 
} 

DÜZENLEMEYİ takipçileri saymak: Bu fonksiyon bir parçasıdır

Benim tablo 'sınıf Application_Model_DbTable_Followers Zend_Db_Table_Abstract uzanır' 'user_id' tarafından yazılan makalede yapısı

  • id
  • makale_kimliği // id. Makalenin
  • user_id // user_id sahibi
  • Bu maddenin
  • tarih // tarihi şu sahiptir
  • follower_id // üyesi

'user_id' yazılabilir çeşitli makaleler, takipçi olabilir izleyin aynı yazarın çeşitli makalelerini takip edin. Benzersiz bir takipçi sayısı yapmak istiyorum. İstediğim bir örnek olarak, bir takipçinin bir yazara ait 8 makaleyi takip etmesi halinde, bu sayıdaki '1' ile karşılaştırılması gerekir.

Umarım bu, ulaşmaya çalıştığım şeyi anlamak için yeterince açık olacaktır. Saygılarımızla

,

Nicky

cevap

11

1 döndürür:

public function countFollowers($user_id) 
{ 
    $select = $this->select() 
       ->distinct() 
       ->where('user_id = ?', $user_id); 

    $rowset = $this->fetchAll($select); 
    $rowCount = count($rowset); 

    return $rowCount; 
} 

EDIT: Söz konusu düzenleme bir kullanıcının takipçileri sayısını almak için sonra. Aslında, grup farklı DEĞİLDİR. Ben

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

aşağıdaki sorgu sayısı() ed olmaya veri getirmek için çalışır test ettik Ben kodu test etmedim ama böyle bir şey çalışması gerekir:

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

Sen seçme sorgusu fonksiyonunu oluşturan 'dan' işlevinde MySQL fonksiyonlarını belirtebilirsiniz. Bu işlevi kullanmak için tablo adının ilk parametre olarak girilmesi gerekir, ancak bunu $ (tablo modeli sınıfınız) geçirmeden iyi çalışır.

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ğiştir] Düzenlemenize, 'grubunun' da sizin için işe yarayabilir dayanarak

:

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

    return count($rowset); 
} 

Bu irade grup hepsi bir kaydına user_id eşleşen. Bir kullanıcı bulunursa Yani, farklı kullanarak başka, 0.

+0

Harika! Bu işe yaradı, tek düzenleme grubu 'follower_id' olarak ayarlamaktı, çünkü biz sadece user_id'i aldık ve bu her zaman '1' olacak. Çok teşekkürler! – Nicky

2

tüm satırları alınıyor sadece bir sayı almak için beni aşırı sıkıyor.

Böyle bir şey kullanarak bir sayımını yapabilirsiniz:

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

yazmayın o:

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

    return count($rowset); 
} 

Ama bu: Else

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

    return count($rowset); 
} 

hatayla olacak Mysqli gibi görünüyor hata hazırlar:

Unknown column 'repertoire.distinct idRepertoireParent' in 'field list'

0

Bugün JOIN LEFT vakasında DISTINCT'i denedim ve işe yaramıyor. Ancak DISTINCT sütununa bir Group By eklerseniz, iyi çalışır.

0

Ayrıca sadece "ayrı"

Yapı bu sorgu kullanmak, resmi manuel

itibaren bir yöntemi vardır:. DISTINCT SEÇİMİ s "ürünler" DAN "product_name" p OLARAK

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