Вопрос по limit

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
PetrOFF
Сообщения: 52
Зарегистрирован: 2011.11.23, 13:07

Вопрос по limit

Сообщение PetrOFF »

Тут искал в поиске но так и не понял.
есть такой запрос, жадная загрузка

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

$data['event'] = Event::model()->notstarted()->
                with(
                        array(
                            
                            "markets" => array(
                                "scopes" => "visible_del_live",
                                "with" => array(
                                    "marketTemplate" => array(
                                        "with" => array(
                                            "marketgrouptemplates" => array(
                                                "scopes" => "del_head",
                                                "joinType" => "INNER JOIN"
                                            )
                                        )
                                    )
                                )
                            )
                        )
                )
                ->findAll(array("condition" => "t.dt >= current_date"));
соотвественно генерится sql код

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

 SELECT "t"."id" AS "t0_c0", "t"."tournament_id" AS "t0_c1",
"t"."dt" AS "t0_c2", "t"."stop_dt" AS "t0_c3", "t"."name" AS "t0_c4",
"t"."status_type" AS "t0_c5", "t"."status_desc_id" AS "t0_c6", "t"."locked"
AS "t0_c7", "t"."weigh" AS "t0_c8", "t"."del" AS "t0_c9", "t"."ut" AS
"t0_c10", "t"."enet_id" AS "t0_c11", "t"."tv_channel" AS "t0_c12",
"t"."max_bet" AS "t0_c13", "t"."max_payout" AS "t0_c14", "t"."margin" AS
"t0_c15", "t"."margin_prebet" AS "t0_c16", "t"."stop_loss" AS "t0_c17",
"t"."only_singles" AS "t0_c18", "t"."line_position" AS "t0_c19",
"t"."participant_block" AS "t0_c20", "t"."enet_stat_url" AS "t0_c21",
"t"."tv_channel_id" AS "t0_c22", "markets"."id" AS "t1_c0",
"markets"."event_id" AS "t1_c1", "markets"."market_template_id" AS "t1_c2",
"markets"."result_type_id" AS "t1_c3", "markets"."visible" AS "t1_c4",
"markets"."del" AS "t1_c5", "markets"."ut" AS "t1_c6", "markets"."max_bet"
AS "t1_c7", "markets"."max_payout" AS "t1_c8", "markets"."live_id" AS
"t1_c9", "markets"."suspend" AS "t1_c10", "markets"."staff_id" AS "t1_c11",
"markets"."weight" AS "t1_c12", "markets"."calc" AS "t1_c13",
"markets"."stop_loss" AS "t1_c14", "markets"."iplast" AS "t1_c15",
"markets"."suspend_reason" AS "t1_c16", "markets"."is_head" AS "t1_c17",
"marketTemplate"."id" AS "t2_c0", "marketTemplate"."name" AS "t2_c1",
"marketTemplate"."market_type_id" AS "t2_c2",
"marketTemplate"."outcome_types" AS "t2_c3", "marketTemplate"."del" AS
"t2_c4", "marketTemplate"."ut" AS "t2_c5", "marketTemplate"."weigh" AS
"t2_c6", "marketTemplate"."market_type_count" AS "t2_c7",
"marketTemplate"."multi_result" AS "t2_c8", "marketTemplate"."scope_data"
AS "t2_c9", "marketTemplate"."autocalc" AS "t2_c10",
"marketTemplate"."result_type_id" AS "t2_c11",
"marketTemplate"."autocalc_by_result" AS "t2_c12",
"marketTemplate"."scope_data_link" AS "t2_c13",
"marketTemplate"."name_format" AS "t2_c14", "marketgrouptemplates"."id" AS
"t3_c0", "marketgrouptemplates"."market_group_id" AS "t3_c1",
"marketgrouptemplates"."market_template_id" AS "t3_c2",
"marketgrouptemplates"."result_type_id" AS "t3_c3",
"marketgrouptemplates"."del" AS "t3_c4", "marketgrouptemplates"."sport_id"
AS "t3_c5" FROM "event" "t"  LEFT OUTER JOIN "market" "markets" ON
("markets"."event_id"="t"."id") AND (markets.live_id is NULL AND
markets.del='no'  AND markets.visible = 'yes' AND markets.suspend = 'no') 
LEFT OUTER JOIN "market_template" "marketTemplate" ON
("markets"."market_template_id"="marketTemplate"."id")  INNER JOIN
"market_group_template" "marketgrouptemplates" ON
("marketgrouptemplates"."market_template_id"="marketTemplate"."id") AND
(marketgrouptemplates.result_type_id is not null and
marketgrouptemplates.del = 'no')  WHERE ((status_type='notstarted') AND
(t.dt >= current_date))
мне надо добавить лимит

то есть я логично добавялю его здесь

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

->findAll(array("condition" => "t.dt >= current_date","limit"=>10));
и ожидаю получить

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

 WHERE ((status_type='notstarted') AND
(t.dt >= current_date)) LIMIT 10
но в результате получаю два запроса, один собственно говоря сам оператор лимит

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

SELECT "t"."id" AS "t0_c0", "t"."tournament_id" AS "t0_c1",
"t"."dt" AS "t0_c2", "t"."stop_dt" AS "t0_c3", "t"."name" AS "t0_c4",
"t"."status_type" AS "t0_c5", "t"."status_desc_id" AS "t0_c6", "t"."locked"
AS "t0_c7", "t"."weigh" AS "t0_c8", "t"."del" AS "t0_c9", "t"."ut" AS
"t0_c10", "t"."enet_id" AS "t0_c11", "t"."tv_channel" AS "t0_c12",
"t"."max_bet" AS "t0_c13", "t"."max_payout" AS "t0_c14", "t"."margin" AS
"t0_c15", "t"."margin_prebet" AS "t0_c16", "t"."stop_loss" AS "t0_c17",
"t"."only_singles" AS "t0_c18", "t"."line_position" AS "t0_c19",
"t"."participant_block" AS "t0_c20", "t"."enet_stat_url" AS "t0_c21",
"t"."tv_channel_id" AS "t0_c22" FROM "event" "t"  WHERE
((status_type='notstarted') AND (t.dt >= current_date)) LIMIT 10
а другой условие вставки первого, и как результат срабатывает не правильно.

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

SELECT "t"."id" AS "t0_c0", "markets"."id" AS "t1_c0",
"markets"."event_id" AS "t1_c1", "markets"."market_template_id" AS "t1_c2",
"markets"."result_type_id" AS "t1_c3", "markets"."visible" AS "t1_c4",
"markets"."del" AS "t1_c5", "markets"."ut" AS "t1_c6", "markets"."max_bet"
AS "t1_c7", "markets"."max_payout" AS "t1_c8", "markets"."live_id" AS
"t1_c9", "markets"."suspend" AS "t1_c10", "markets"."staff_id" AS "t1_c11",
"markets"."weight" AS "t1_c12", "markets"."calc" AS "t1_c13",
"markets"."stop_loss" AS "t1_c14", "markets"."iplast" AS "t1_c15",
"markets"."suspend_reason" AS "t1_c16", "markets"."is_head" AS "t1_c17",
"marketTemplate"."id" AS "t2_c0", "marketTemplate"."name" AS "t2_c1",
"marketTemplate"."market_type_id" AS "t2_c2",
"marketTemplate"."outcome_types" AS "t2_c3", "marketTemplate"."del" AS
"t2_c4", "marketTemplate"."ut" AS "t2_c5", "marketTemplate"."weigh" AS
"t2_c6", "marketTemplate"."market_type_count" AS "t2_c7",
"marketTemplate"."multi_result" AS "t2_c8", "marketTemplate"."scope_data"
AS "t2_c9", "marketTemplate"."autocalc" AS "t2_c10",
"marketTemplate"."result_type_id" AS "t2_c11",
"marketTemplate"."autocalc_by_result" AS "t2_c12",
"marketTemplate"."scope_data_link" AS "t2_c13",
"marketTemplate"."name_format" AS "t2_c14", "marketgrouptemplates"."id" AS
"t3_c0", "marketgrouptemplates"."market_group_id" AS "t3_c1",
"marketgrouptemplates"."market_template_id" AS "t3_c2",
"marketgrouptemplates"."result_type_id" AS "t3_c3",
"marketgrouptemplates"."del" AS "t3_c4", "marketgrouptemplates"."sport_id"
AS "t3_c5" FROM "event" "t" LEFT OUTER JOIN "market" "markets" ON
("markets"."event_id"="t"."id") AND (markets.live_id is NULL AND
markets.del='no'  AND markets.visible = 'yes' AND markets.suspend = 'no') 
LEFT OUTER JOIN "market_template" "marketTemplate" ON
("markets"."market_template_id"="marketTemplate"."id")  INNER JOIN
"market_group_template" "marketgrouptemplates" ON
("marketgrouptemplates"."market_template_id"="marketTemplate"."id") AND
(marketgrouptemplates.result_type_id is not null and
marketgrouptemplates.del = 'no')  WHERE ("t"."id" IN ('129271', '129272',
'129273', '129274', '129275', '129276', '129277', '129278', '129279',
'129280'))
 
Как получить ожидаемый мной запрос?
PetrOFF
Сообщения: 52
Зарегистрирован: 2011.11.23, 13:07

Re: Вопрос по limit

Сообщение PetrOFF »

По умолчанию Yii использует "жадную" загрузку, то есть генерирует один SQL запрос, кроме того случая, когда к главной модели применяется LIMIT. Если выставить опцию together в описании связи в true, то мы получим единственный SQL запрос даже если используется LIMIT. Если использовать false, то выборка из некоторых таблиц будет производиться отдельными запросами.
А вот и ответ, приятно ответить самому себе :)
Ответить