Mam ponadto tablicę zajecia [id, nazwa, rok] przechowującą dane o dostępnych zajęciach (np. wykłady,..). Ponadto mam tablicę student_zajecia [student_id, zajecia_id] która obsługuje relację w/w (jacy studenci chodzą na jakie zajęcia).
Dla danych zajęć (o np. identyfikatorze 3) chciałbym wyświetlić najpierw listę studentów, którzy uczęszczają na dane zajęcia, a potem tych, którzy na nie nie uczęszczają (nieważne w tej chwili, po co tak ma być). Pierwszy pomysł, który mi się nasuwa, to zrobić tak:
SELECT `id`, CONCAT(`nazwisko`,' ',`imie`) AS `imienazwisko` FROM `student` WHERE id IN ( SELECT `student_id` FROM `student_zajecia` WHERE `zajecia_id`=3 )
a potem wybrać analogicznie:
SELECT `id`, CONCAT(`nazwisko`,' ',`imie`) AS `imienazwisko` FROM `student` WHERE id NOT IN ( SELECT `student_id` FROM `student_zajecia` WHERE `zajecia_id`=3 )
Są to jednak dwa zapytania, więc nienajlepiej. Mogę to zrobić np. tak:
SELECT `id` , CONCAT( `nazwisko` , ' ', `imie` ) AS `imienazwisko` , CASE WHEN id IN ( SELECT `student_id` FROM `student_zajecia` WHERE `zajecia_id` =1 ) THEN 1 ELSE 0 END AS `czy` FROM `student` ORDER BY `czy`
Nie wiem jednak, jak baza danych radzi sobie z tym zapytaniem (czy robi to w mia
ę optymalnie).
Ponadto, tak otrzymane dane nie są dla mnie aż tak przyjazne jak w powyższej syt
acji. Chodzi o to, że wszystko mam w jednej tablicy, więc muszę z poziomu smarty jakoś ją podzielić (choćby logicznie), a nie wiem jak. Przebiegając wyniki (korzystam z biblioteki PDO) w szablonie smarty za pomocą sekcji {foreach} musiałbym ją jakoś przerwać w chwili, gdy wiersze będą miały czy=1. Potem w drugiej sekcji zacząć od tamtego miejsca i kontynuować. Mógłbym łatwo przygotować Smartym te dane z poziomu PHP, ale wtedy bym dwa razy musiał przebiegać wyniki. Może jest jakiś lepszy sposób.
Moje pytanie:
1) Czy rzeczywiście warto użyć drugiej metody (chodzi o zapytania MySQL), mimo problemów z obróbką danych przez PHP?
2) Jeśli tak, to czy znacie możliwość przerywania pętli w szablonie smarty i potem kontynuowanie jej w drugiej pętli? A może dać sobie w tej sytuacji spokój z szablonami i wszystko zrobić za pomocą "czystego" PHP?
_______________________________________________________
Dopisane o 22:13
_______________________________________________________
Ja to mam pecha, bo na około połowę pytań nikt nie chce odpowiedzieć

Rozwiązałem to za pomocą jednego zapytania (tego bardziej rozbudowanego). Dane obsłużyłem bez biblioteki smarty (nie wiedziałem jak bez dwukrotnego przebiegnięcia po danych):
$stmt = $pdo -> prepare(' SELECT `id` , CONCAT( `nazwisko` , ' ', `imie` ) AS `nazwiskoimie` , `indeks`, CASE WHEN `id` IN ( SELECT `student_id` FROM `student_zajecia` WHERE `zajecia_id` = :zajecia_i
d) THEN 1 ELSE 0 END AS `czy` FROM `student` ORDER BY `czy` DESC , `nazwiskoimie` '); //kolejność fajnie gdyby mogła być wybierana (nazwisko, a może indeks) $stmt -> bindValue(':zajecia_id', $_SESSION['zajecia_id'], PDO::PARAM_INT); $stmt -> execute(); //wysylam gotowe zapytanie if(!$stmt->rowCount()) //jesli nie zwrocilo zadnych studentów { echo '<p> Baza danych studentów jest pusta albo wystąpił nieokreślony błąd. </p>'; } else { //Wyświetlam w dwóch listach osoby, które są zapisane na zajęcia i które nie są. O
bok nich przyciski służą do zmiany tego. ?> <h3>Lista osób zapisanych na zajęcia</h3> <?php $row=$stmt -> fetch(); if($row['czy']==0) { ?> <p>Brak osób zapisanych na zajęcia</p> <?php } else //są osoby zapisane na zajęcia { ?> <table class="dane"> <tr> <th>Nazwisko i imię</th> <th>Numer indeksu</th> <th>Usuń studenta z listy</th> </tr> <?php do { echo ' <tr> <td>'.$row['nazwiskoimie'].'</td> <td>'.$row['indeks'].'</td> <td><input type="checkbox" name="'.$row['id'].'"></td> </tr> '; } while (($row=$stmt -> fetch())&&($row['czy']==1)); }; ?> </table> <h3>Lista pozostałych osób</h3> <?php if($row)//tzn. są jeszcze studenci w bazie danych, którzy nie są zapisani na dane zajęcia (tak powinno być najczęściej) { ?> <table class="dane"> <tr> <th>Nazwisko i imię</th> <th>Numer indeksu</th> <th>Dodaj studenta do listy</th> </tr> <?php do { echo ' <tr> <td>'.$row['nazwiskoimie'].'</td> <td>'.$row['indeks'].'</td> <td><input type="checkbox" name="'.$row['id'].'"></td> </tr> '; } while ($row=$stmt->fetch()); ?> </table> <?php } else { ?> <p>Brak osób, które nie są zapisane na zajęcia.</p> <?php } } closecursor($stmt);
Jak widać pomieszane są HTML i PHP. Za pomocą smarty byłoby ładniej, ale nie wiem, jak możnaby to zaimplementować. Może ktoś ma pomysł?