right outer join

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
karagodin
Сообщения: 26
Зарегистрирован: 2010.07.03, 06:26
Контактная информация:

right outer join

Сообщение karagodin » 2010.09.01, 08:57

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

Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: right outer join

Сообщение timlar » 2010.09.01, 10:43

попробуй вместо right outer join просто right join
Twitter: @timlar_ua

karagodin
Сообщения: 26
Зарегистрирован: 2010.07.03, 06:26
Контактная информация:

Re: right outer join

Сообщение karagodin » 2010.09.01, 11:52

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

mitallast
Сообщения: 207
Зарегистрирован: 2010.02.21, 20:40
Откуда: Голицыно
Контактная информация:

Re: right outer join

Сообщение mitallast » 2010.09.01, 12:05

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

Ответить