Условно включается в Учение? - PullRequest
0 голосов
/ 14 июля 2011

У меня есть две таблицы, местоположение и прогноз. Я хотел бы запросить базу данных, чтобы найти все местоположения, которые соответствуют параметрам прогноза на каждый день.

например. В Лондоне есть прогнозные записи на дни 2011-07-13, 2011-07-14, 2011-07-15 и 2011-07-16. Я бы хотел, чтобы Лондон вернулся, если в 2011-07-14 И 2011-07-15 температура не выше 40 и не ниже 13.

Мне удалось решить это в MySQL (я думаю): SELECT f1.day, f1.temperature_high, f1.temperature_low, f2.day, f2.temperature_high, f2.temperature_low, l.name FROM location l INNER JOIN forecast f1 ON f1.location_id = l.id AND f1.day = '2011-07-14' AND f1.temperature_high <= '40' AND f1.temperature_low >= '13' INNER JOIN forecast f2 ON f2.location_id = l.id AND f2.day = '2011-07-15' AND f2.temperature_high <= '40' AND f2.temperature_low >= '13';

Я пытался перевести это в Доктрину, но у меня возникают ошибки исчерпания памяти. Мой запрос доктрины: $this->results = Doctrine_Query::create()->select('l.name')->from('Location l');</p> <p>foreach ($values['day'] as $i => $day) { $this->results->innerJoin('l.Forecasts f'.$i.' ON f'.$i.'.condition_id IN (' . implode(',', $values['condition']) . ') AND f'.$i.'.temperature_high <= ' .$values['temperature_max'] . ' AND f'.$i.'.temperature_low >= ' . $values['temperature_min']); } $this->results->execute();

Как правильно и наиболее эффективно выполнить этот запрос? Я почти уверен, что делаю что-то в корне неправильно.

Большое спасибо заранее
Пит

1 Ответ

2 голосов
/ 14 июля 2011

Я думаю, было бы проще использовать $query->addWhere('EXISTS (...)') с внутренним оператором выбора для каждого условия.

$this->results = Doctrine_Query::create()->select('name')->from('location');

foreach ($values['day'] as $i => $day) {
    $this->results->addWhere('EXISTS (
        SELECT NULL
        FROM forecast
        WHERE location_id = location.id
        AND condition_id IN (' . implode(',', $values['condition']) . ')
        AND temperature_high <= ' . $values['temperature_max'] . '
        AND temperature_low >= ' . $values['temperature_min'] . '
    )');
}
$this->results->execute();
...