mam do napisania dość spore zapytanie do bazy, które ma za zadanie pobierać listę restauracji (pobiera listę, z innej tabeli średnią ocen - to niby działa). Ostatnio przyszła potrzeba dodania sortowania i pobierania po tagach/filtrowania. Tu jest problem bo nie chce działać, czy mógłby ktoś poradzić jak to naprawić? Działa jeśli zamiast AND przy tagach dam OR ale przecież nie o to chodzi - chcę tylko restauracje które zawierają wszystkie podane tagi. Poniżej wklejam zapytanie SQL/kod w ZF/schemat bazy. Przy okazji, count(t.id) zwraca ilość wszystkich tagów przypisanych do wszystkich rekordów, też nie wiem czemu.
SELECT `r`.`id`, `r`.`name`, `r`.`address`, `r`.`description`, `r`.`city`, IF(add_date >= (now() - interval 2 week), ' nowość', '') AS `isnew`, avg(p.rank) AS `points`, `rt`.`id` AS `rtid`, count(t.id) AS `tag_count` FROM `restaurants` AS `r` LEFT JOIN `rate` AS `p` ON p.rid = r.id INNER JOIN `tagged_restaurants` AS `rt` ON rt.restaurant_id = r.id INNER JOIN `tags` AS `t` ON t.id = rt.tag_id WHERE (t.tag = 'polska') AND (t.tag = 'karta') GROUP BY `r`.`id` ORDER BY `tag_count` DESC LIMIT 8
public function getAll($filter = null, $sort = null) { $select = $this->select() ->setIntegrityCheck(false) if($filter != null) { foreach($filter as $f) { $select->where($this->getDefaultAdapter()->quoteInto('t.tag = ?', $f)); // Jak tu wstawię orWhere to zaczyna działać, ale nie tak jak oczekuję } if($sort == 'r.id') { $select->order('tag_count desc'); } } if($filter == null) { $select->order($sort); } $select->group('r.id'); return $select; }
Tabele:
tags: id, tag
tagged_restaurants: id, restaurant_id, tag_id
restaurants: id, name, address (w sumie tylko te są ważne)
rate: id, rid (id restauracji), rank (ocena)
Proszę o pomoc
