Hej,
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()
->from(array('r' => 'restaurants'), array('r.id', 'r.name', 'r.address', 'r.description', 'r.city', 'isnew' => new Zend_Db_Expr
(" if(add_date >= (now() - interval 2 week), ' nowość', '')"))) ->setIntegrityCheck(false)
->joinLeft(array('p' => 'rate'), 'p.rid = r.id', array('points' => new Zend_Db_Expr
('avg(p.rank)'))); if($filter != null) {
$select->join(array('rt' => 'tagged_restaurants'), 'rt.restaurant_id = r.id', array('rtid' => 'rt.id')); $select->join(array('t' => 'tags'), 't.id = rt.tag_id', array('tag_count' => 'count(t.id)'));
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 (IMG:
style_emoticons/default/smile.gif)
Ten post edytował Vielta 4.10.2011, 16:18:58