Страница 1 из 1

right outer join

Добавлено: 2010.09.01, 08:57
karagodin
Сделал связь между моделями с right outer join. Все прекрасно пока результаты не выводятся с помощью пагинатора. Например если в результате запроса 3 записи, а у пагинатора количество элементов на странице 10, то выводится еще 7 лишних строк. Это из-за того что он устанавливает лимит 10. Так вот с какой стороны решать, придумывать запрос без right join или эту проблему можно обойти самим yii?

Re: right outer join

Добавлено: 2010.09.01, 10:43
timlar
попробуй вместо right outer join просто right join

Re: right outer join

Добавлено: 2010.09.01, 11:52
karagodin
это то же самое. тот же результат если использовать INNER JOIN. проблема не в том что запрос не правильно выполняется, а в том что когда в результате строк меньше чем лимит, то добавляются лишние строки.
виджет CListView например пишет "Элементы 1—10 из 2".

Re: right outer join

Добавлено: 2010.09.01, 12:05
mitallast
right join , видимо, подразумевает связь один-ко-многим типа:

Код: Выделить всё

foo has many bar: 
и соответствующий стандартный запрос:

Код: Выделить всё

select foo.* , bar.* from from foo right join  bar on (...) limit 2,2
к сожалению, это не пойдет на связях has many && many many.

тут можно пойти двумя путями:
1) не выбирать элементы, но делать right join для фильтрации типа

Код: Выделить всё

post::model()->findAll(array(
  "criteria" => array(
    "join" => "right join comments c on t.id = c.post_id"
  )
)); 
а нужные строки получить через lazy load

2) сделать свою реализацию пагинации - узнавать , сколько будет приджойненных строк на один элемент основной таблицы запросом типа

Код: Выделить всё

select count(*) from commerce_product_section s
right join commerce_product p on s.id = p.section_id
group by s.id
----------------------------------------
4
5
12
4
5
и уже из него считать пагинацию, типа:

Код: Выделить всё

pages = 5, offset(2) : 4+5 , limit(2) 12+4
и получить запрос:

Код: Выделить всё

select foo.* , bar.* from from foo right join  bar on (...) limit 16,9