2011-07-18 12 views
7

Mam długo szukać, aby to działa.Jak używać "odrębny" w modelu zend db

Chcę wiedzieć, w jaki sposób mogę "odróżnić" użytkownika w modelu zend db, aby mój wybór dla obserwujących użytkownika był unikalny.

Mój model db liczyć obserwuje dla użytkownika (tu muszę dodać „odrębny”)

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

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

EDIT: Ta funkcja jest częścią „Application_Model_DbTable_Followers klasy rozciąga Zend_Db_Table_Abstract”

moim stole struktura

  • id
  • article_id // Id artykułu, który został napisany przez 'user_id'.
  • user_id // user_id właściciel artykułu
  • follower_id // członek, który ma po tym artykule
  • data // data śledzić

'user_id' można zapisać różne artykuły, wyznawca może śledzić różne artykuły tego samego pisarza. Chcę zrobić wyjątkową liczbę obserwujących. Jako przykład, czego chcę, jeśli obserwujący podąża za 8 artykułami jednego pisarza, należy go porównać do "1" w liczniku.

Mam nadzieję, że będzie to wystarczająco jasne, aby zrozumieć, co próbowałem osiągnąć.

Z poważaniem,

Nicky

Odpowiedz

11

Korzystanie odrębny:

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

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

    return $rowCount; 
} 

EDIT: Po edycji w pytaniu, aby uzyskać liczbę wyznawców użytkownik. W rzeczywistości musisz użyć grupy NOT distinct. Ja testowałem Następująca kwerenda działa się pobrać dane, aby być count() ed

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

nie testowałem ten kod, ale coś jak to powinno działać:

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

Można określić funkcje mysql w 'z' funkcji, które tworzą funkcję select kwerendy. Aby użyć funkcji from, musisz podać nazwę tabeli jako pierwszy parametr, jednak przekazanie $ this (klasa twojego modelu tabeli) działa poprawnie.

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

    return count($rowset); 
} 

[edytuj]

oparciu o edycję, 'grupy' może również pracować dla Ciebie:

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

    return count($rowset); 
} 

tej grupy wszystkie pasujące user_id na jednej płycie. Więc jeśli użytkownik zostanie znaleziony, to zwraca 1, w przeciwnym wypadku 0.

+0

Świetnie! To działa, jedyną zmianą było ustawienie grupy na "follower_id", ponieważ otrzymamy tylko identyfikator użytkownika i zawsze będzie to "1". Wielkie dzięki! – Nicky

2

Odzyskiwanie wszystkie wiersze po prostu liczenie uderza mnie jako przesadę.

Można to zrobić za pomocą licznika coś takiego:

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

nie napisać, że:

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

    return count($rowset); 
} 

ale:

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

    return count($rowset); 
} 

inny nie masz błąd Wygląda na to, że Mysqli przygotowuje błąd:

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

0

Dzisiaj próbowałem DISTINCT w przypadku JOIN LEFT i nie działa. Ale jeśli dodasz Group By do kolumny DISTINCT, działa dobrze.

0

Również mamy jedną metodę z oficjalnej instrukcji

Wystarczy użyć "odrębny"

Budowa ta kwerenda. SELECT DISTINCT p "PRODUCT_NAME" z "produktów", jak p

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