Zend framework - zapytanie do MySQL

Odpowiedz Nowy wątek
2014-01-19 20:35
0

Mam problem ze zdefiniowaniem zapytania do MySQL w Zendie.
Zapytanie:

SELECT artykuly.id, artykuly.tytul, artykuly.tresc, artykuly.data_opb, artykuly.autor, votes.id_user, AVG(votes.ocena) AS ocena FROM artykuly LEFT JOIN votes ON artykuly.id=votes.id_artykul GROUP BY votes.id_artykul ORDER BY ocena {$this->filtr['sort-asc-desc']} {$limit}

Pomoże ktoś?
Sam głowię się nad nim cały dzień i nic wiele nie mogę wykombinować. Zajrzałem do manuala jednak nic nie znalazłem.
Wiem że trzeba użyć select() ->from(tutaj tabele ?) -> join(?) -> order(?) ->group(?);

edytowany 1x, ostatnio: NewUser2k13, 2014-01-19 20:40

Pozostało 580 znaków

2014-01-20 09:13
1

Powinno to wyglądać mniej więcej tak:

$select = $this->select()->setIntegrityCheck(false); // setIntegrityCheck pozwala na dołączenie innej tabeli niż ta podana w modelu
// $select = $this->_db->select(); // tutaj nie trzeba stosować w/w metody ponieważ korzystamy z modelu ogólnego

$select->from(array('alias' => 'tableName'), array('columns', 'list'))
     ->joinLeft(array('alias' => 'joinTableName'), 'on clause', array('columns', 'list'))
     ->group(array('alias.columnName'))
     ->order(array('alias.columnName'))
     ->limit('count', 'offset');

Pozostało 580 znaków

2014-01-20 18:54
0

@freemp3 - możesz sprawdzić?

$select->from(array('artykuly' => 'artykuly'), array('columns', array("id", "tytul", "tresc", "data_opb", "autor")))
     ->joinLeft(array('votes' => 'votes'), 'on clause', array('columns', 'array("id")'))
     ->group(array('votes.id_artykul'))
     ->order(array('ocena'))
     ->limit($limit);

Jeszcze sprawa odnośnie this->filtr['sort-asc-desc'] - to zwraca ASC lub DSC (czyli czy rosnąco/malejaco mają być posortowane) - gdzie to podpiąć?

edytowany 2x, ostatnio: dzek69, 2014-01-20 20:29

Pozostało 580 znaków

2014-01-20 20:29
0

zdaje się, że: order(array('ocena DESC'))

z tym że masz do wyboru ASC lub DESC, nie DSC

a jak sortujesz po jednej kolumnie to już w ogóle: ->order('ocena DESC')->


edytowany 2x, ostatnio: dzek69, 2014-01-20 20:30

Pozostało 580 znaków

2014-01-20 20:47
0
$select->from(array('artykuly' => 'artykuly'), array('columns', array("id", "tytul", "tresc", "data_opb", "autor")))
     ->joinLeft(array('votes' => 'votes'), 'on clause', array('columns', 'array("id")'))
     ->group(array('votes.id_artykul'))
     ->order('ocena '.$this->filtr['sort-asc-desc'])
     ->limit($limit);

Teraz jest wszystko OK?

edytowany 1x, ostatnio: dzek69, 2014-01-21 09:08
wklejasz kod PHP to w <code> używaj php, nie sql - dzek69 2014-01-21 09:09

Pozostało 580 znaków

2014-01-21 08:57
1

1.

$select->from(array('artykuly' => 'artykuly'), array('columns', array("id", "tytul", "tresc", "data_opb", "autor")))

Nie chodziło mi o to, że podajesz jako pierwszy element 'columns', a później liste kolumn, tylko że jest to lista kolumn jako tablica ;)

$select->from(array('artykuly' => 'artykuly'), array("id", "tytul", "tresc", "data_opb", "autor"))

Podobnie przy joinLeft.

  1. W joinLeft: 'on clause' w to miejsce powinieneś wstawić warunek, według którego tabele będą łączone.

  2. Przed dołączeniem zmiennej do order można jeszcze sprawdzić, czy aby na pewno znajduje się tam ASC lub DESC. Tak dla bezpieczeństwa :)


edytowany 1x, ostatnio: freemp3, 2014-01-21 08:58

Pozostało 580 znaków

2014-01-21 09:09
1

@freemp3

  1. zależy skąd ta dana pochodzi, nie będzie błędem, gdy będzie to puste.

Jak najbardziej, wszystko to jest zależne. Gdyby na przykład był dołączany wynik funkcji, sprawdzanie można pominąć, ponieważ "teoretycznie" funkcja powinna zapewnić poprawność tego co zwraca. Tutaj jest dołączana zmienna z tablicy, nie wiemy, w jaki sposób jest generowana jej wartość, dlatego dodałem informacje, że można by ewentualnie też dodać jej sprawdzenie :) może przesadzam, ale wole mieć pewność co mam w zmiennych ;) - freemp3 2014-01-21 09:26

Pozostało 580 znaków

2014-01-21 11:06
0

@dzek69
@freemp3

Niestety jest błąd w JOIN... - prawdopodobnie przez AVG(..) AS ocena

$limit = ($formulage['ilosc'] == "ALL") ? "" : "LIMIT {$formulage['ilosc']}";

if($formulage['sort'] == "ocena") {
              $select->from(array('artykuly' => 'artykuly'), array(array("id", "tytul", "tresc", "data_opb", "autor"))
            ->joinLeft(array('votes' => 'votes'), 'artykuly.id=votes.id_artykul', array("votes.id_user", "AVG(votes.ocena) AS ocena"))
            ->group(array('votes.id_artykul'))
            ->order('ocena '.$formulage['sort-asc-desc'])
            ->limit($limit);
$this->view->articles = artykuly->fetchAll($select);
}

Dodatkowo mam jeszcze pytanie odnośnie Zenda.
Czy istnieje jakaś zmienna w Zendie, która widoczna jest w całym projekcie?
Chciałbym po UDANYM zalogowaniu usera do tej zmiennej przypisać jego nick -> coś na wzór $_SESSION['login'] = $nick;

edytowany 2x, ostatnio: dzek69, 2014-01-21 11:41
po raz trzeci poprawiam po Tobie błąd, jeżeli wklejasz kod PHP to używaj <code=php> PROSZĘ - dzek69 2014-01-21 11:41

Pozostało 580 znaków

2014-01-21 11:12
0

Jeśli chcesz nadawać aliasy kolumnom to robisz to tak jak w przypadku tabel czyli:

array('alias'=>'kolumnaZAiliasem', 'kolumnaBezAliasu');

Pozostało 580 znaków

2014-01-21 12:05
0

@freemp3

Nadal wywala błąd:
Parse error: syntax error, unexpected T_OBJECT_OPERATOR in (path)/application/controllers/PodstronyController.php on line 63

Linia 63:

->joinLeft(array('votes' => 'votes'), 'artykuly.id=votes.id_artykul', array("votes.id_user", array('ocena'=>'AVG(votes.ocena)', 'votes.ocena'))
edytowany 1x, ostatnio: NewUser2k13, 2014-01-21 12:06

Pozostało 580 znaków

2014-01-21 12:12
0

Pokaż cały kod odpowiedzialny za tworzenie zapytania.
Po drugie

array("votes.id_user", array('ocena'=>'AVG(votes.ocena)', 'votes.ocena'))

Na liście kolumn nie dodaje się nowych tablic, wszystko ma znajdować się w jednopoziomowej tablicy:

array("votes.id_user", 'ocena'=>'AVG(votes.ocena)', 'votes.ocena')

Alias jest kluczem danego elementu, a nazwa kolumny wartością.


Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0