Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][SQL] Zawiłe zapytanie do bazy z LIMIT 1
Forum PHP.pl > Forum > PHP
adek-
Witam, zrobiłem sobie wywołanie z bazy które ma mi wyciągać po jednym z aktywnych szkoleń (w bazie pokaz=1) najbliższym do dzisiejszej daty i jest prawie OK, ale... gdy jest dodane szkolenie z jakąś data, które oczywiście się wyświetla i dodam kolejne z nieco wcześniejszą datą niż ta już dodana to dalej wyświetla mi tamto dalsze wcześniej dodane szkolenie, tak jak by nie brał pod uwagę tych z nowszą datą, ale z wyższym ID - dodanych później.

w bazie:
szklenia - głowna tabela gdzie jest ID, DATA_szkolenia, IDszkolenia, IDnauczyciela, IDrodzaj_szkolenia które łączę za pomocą Lft JOIN z następnymi
szkolenia_rodzaje - tabela gdzie są wylistowane wszystkie szkolenia, łącznie z opisami itd
szkolenia_miasta, nauczyciele - oczywiście miasta i nauczyciele szkolący, mało ważne tutaj

w kontrolerze mam:
  1. function index() {
  2. if($_GET == null)
  3. {
  4. $this->loadModel('index');
  5. }
  6. $count = $this->model->select_one("SELECT COUNT(*) FROM szkolenia_rodzaje WHERE pokaz=1;");
  7. //echo $count[0];
  8. for($i = 1; $i <= $count[0]; $i++)
  9. {
  10. $this->view->szkolenia_daty[$i] = $this->model->select_one(
  11. "SELECT *
  12. FROM szkolenia es
  13. LEFT JOIN szkolenia_rodzaje esr ON es.idszkolenia = esr.id_szkolenia
  14. LEFT JOIN szkolenia_miasto esm ON es.idmiasto = esm.id_miasto
  15. LEFT JOIN szkolenia_nauczyciel est ON es.idnauczyciel = est.id_nauczyciel
  16. WHERE es.dataszkolenia >= NOW() AND es.idszkolenia = ".$i." AND es.idszkolenia LIMIT 1");
  17. }
  18. $this->view->render('index/index');
  19. }


select_one w modelu to nic innego jak
  1. $result = $this->db->select_one($query);
  2. return $result;


w widoku wyciągam już bez kombinowania:
  1. <div id="boxes_tit"><h2>Daty Najbliższych szkoleń</h2></div>
  2. <?php foreach ($this->szkolenia_daty as $rodzaje) : ?>
  3. <?php if($rodzaje['idszkolenia'] != null) : ?>
  4. <div id="box_szk_l">
  5. <div class="box_szk_top"><?php echo $rodzaje['nazwaszkolenia']; ?></div>
  6. <div class="box_szk_mid"><strong>Termin: </strong><?php echo $rodzaje['dataszkolenia']; ?></div>
  7. <div class="box_szk_mid"><strong>Miejsce: </strong><?php echo $rodzaje['miasto']; ?></div>
  8. <div class="box_szk_mid"><strong>Wykładowca: </strong><?php echo $rodzaje['imie']; ?> <?php echo $rodzaje['nazwisko']; ?></div>
  9. <div class="box_szk_btm"><a href="<?php echo $this->_baseurl . 'szkolenia/szkolenie/' . $rodzaje['idszkolenia']; ?>">Więcej...</a></div>
  10. </div>
  11. <?php endif; ?>
  12. <?php endforeach; ?>


przypuszczalnie moim błedem jest to że chcę to wyciągnąć jednym zapytaniem i kombinuję z PHP w nim, bo gdy wcześniej miałem to w strukturalce zrobione na zasadzie - jedno zapytanie o rodzaje szkoleń, a w nim w pętli zapytanie o najbliższe dat z danego szkolenia to wszystko grało... przechodzę teraz całą stroną na MVC i mnie to nieco przytłoczyło, a nie chce dziadować, poradźcie bardziej doświadczeni panowie i panie.
abort
Nie widzę nigdzie w zapytaniu do bazy frazy w stylu "ORDER BY es.dataszkolenia DESC".
adek-
Niestety, przepraszam zapomniałem to tutaj wstawić, bo też już kombinowałem z ORDERami i uznając że zapytanie to nie bierze ich pod uwagę, po prostu je olałem... aczkolwiek pozostawiam dodaję je ponownie bo w sumie masz rację, mógłby to być jeden z powodów... może trzeba będzie całkiem zmienić zapytanie i połączyć je inaczej niż LEFT JOIN? Spróbuję dzisiaj jeszcze zmienić to na zasadzie kilkukrotnego zagnieżdżenia zapytania zamiast LJ.

Niepokoi mnie ta pętla for w tym zapytaniu, przypuszczalnie ona miesza kolejność i wyrzuca ostatnią bądź pierwszą napotkaną...
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-2025 Invision Power Services, Inc.