Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MYSQL][ZEND PHP] Sortowanie tabeli według innej.
Forum PHP.pl > Forum > Bazy danych > MySQL
Cross77
Mam dwie tabele. Pierwsza z nich posiada listę użytkowników:

ID | NICK | PASS | EMAIL

Druga zaś posiada opis rang dla poszczególnych ID z tabeli pierwszej (Ranga to integer 1-2):

ID | RANG

Wykorzystuję Zend PHP :

  1. $dbu = new Application_Model_DbTable_Users();
  2. $dbr = new Application_Model_DbTable_Rangs();
  3. $sort = $this->getRequest()->getParam('sort');
  4. //sort ma mieć w tym przypadku string : rang
  5. //w przypadku gdy jest to ID lub NICK to standardowo używam :
  6.  
  7. switch($sort){
  8. case 'id': $sql = $dbu->select()->order('id');
  9. break;
  10. case 'nick': $sql = $dbu->select()->order('nick');
  11. break;
  12. case 'rang': // brak pomysłu
  13. break;
  14. default: $sql = $dbu->select()->order('id');
  15. }
  16.  
  17.  
  18. $this->view->Users = $dbu->fetchAll($sql);
  19. $this->view->Rangs = $dbr->fetchAll();


Chcę posortować najpierw tablicę z rangami według kolumny RANG, a następnie posortować tablę z użytkownikami według kolejności kolumny ID w tablicy z rangami.
wiiir
  1. $sql = $dbu->select()->order(array('RANG','ID'));


W ZF2
  1. $select = new Select;
  2. $select->order('RANG, ID')

Cross77
Chyba nie tędy droga..
Kod
Message: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'RANG' in 'order clause'


w $dbu jest lista użytkowników, a rangi są w $dbr.

Tabele wyglądają następująco:

Kod
$dbu :

ID    | NICK   | PASS | MAIL
1     | Adam   | SU   | admin@site.eu
2     | Marcin | SU   | user@site.eu
3     | Jerry  | SU   | mod@site.eu
4     | Tom    | SU   | admin@site.eu
5     | Kasia  | SU   | user@site.eu

$dbr :

ID   | RANG
1    | 1
3    | 2
4    | 1

//1 - ADMIN | 2 - MOD


1. Trzeba posortować $dbr według Rangi. W tym przypadku 1, 1, 2.
2. Należy posortować $dbu według kolejności ID w posortowanym $dbr. Będą to tutaj id z $dbu: 1, 4, 3 i reszta to są użytkownicy więc już dalej według id lub alfabetycznie według nicku.
wiiir
Cytat
w $dbu jest lista użytkowników, a rangi są w $dbr.


No i co z tego ?

Napisz dobre zapytanie select i uzyj tego co ci podalem
Cross77
Nie zbytnio rozumiem..
Mam poprawić dbu na dbr? Bo tym bardziej raczej nie zadziała tongue.gif
  1. $sql = $dbr->select()->order(array('RANG','ID'));
  2. $this->view->Users = $dbu->fetchAll($sql);


Kod
Message: Specified column "nick" is not in the row


Czy najpierw wykonać zapytanie z sortowaniem do tabeli $dbr, a następnie odczytać kolejno id (np. 1,4,3) i przy zapytaniu do $dbu podać by pierwsze rekordy były z id 1,4,3, a reszta id rosnąco?
wiiir
pokaz swoje zapytanie sql

chyba ze poprostu robisz po przez select() - select * from dbr?

jakie masz łączanie miedzy tabelami?
Cross77
Cały skrypt php mojej akcji jest w pierwszym poście, a tablice w mysql w kolejnym.
wiiir
  1. $db = Zend_Db::factory(...);
  2. $select = $db->select()
  3. ->from(array('u' => 'dbu'))
  4. ->join(array('r' => 'dbr'),
  5. 'u.id = r.id')
  6. ->order(array('r.rang','u.id'));

Naprawde tak ciężeko napisać złączenie?
Cross77
Wszystko działa według oczekiwań, prócz tego, że wyświetlają się tylko te rekordy które mają jakąś grupę jednak już sobie dalej poradzę.
Dziękuję za pomoc.
wiiir
Wobec tego
  1. ->joinLeft()
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.