Секреты MySQL
На связи Mr. Spock
Сегодня капитан поручил мне разобраться с системой традиционных внутристанционных пятничных опросов. Капитан указал, что обязательно должно учитываться количество проголосовавших по каждой позиции опроса! Придется переделывать старую систему! В жизни вулканианца это сложная задача!
Простейшая система, которую я смог придумать, состояла в том, что существует таблица данных (polls_data) опросов, куда записывается идентификатор опроса ($pid), идентификатор позиции-выбора ($poll_vote_id) и собственно количество голосов ($num_votes).
Пришлось пойти на хитрость и подглядеть исходные коды новой системы детектирования целей, которую мы приобрели на Альдебаране. Система делала простую вещь – обнаруживала цель и увеличивала значение целевой переменной на единицу. Забыл добавить, что система работала на связке Codeigniter и MySQL.
Роясь в исходных кодах системы, я обнаружил метод добавления значения цели и переделал под свою задачу:
function updatePolls($pid, $poll_vote_id){
$query = $this->db->get_where('polls_data', array('poll_id' => $pid, 'id' => $poll_vote_id),1);
if ($query->num_rows() <= 0) return NULL;
$result = $query->row();
$new_num_votes = $result->num_votes + 1;
$this->db->update('polls_data', array('num_votes' => $new_num_votes), array('poll_id' => $pid, 'id' => $poll_vote_id));
return ;
}
Кратко поясню:
2 строка – получаем ряд из базы с идентификатором конкретного опроса и конкретной позиции в опросе;
3 строка – если ничего нет, возвращаем это все к Задоголовым!
4 и 5 строки – получаем старое значение количества голосов и прибавляем единицу;
6 строка – обновляем данные базы новым значением по старым идентификаторам
7 строка – возврат
Поздно вечером капитан подозвал меня к себе и попросил уменьшить число строк в исходном модуле программы – он был не в духе, так как рано вернулся от старшины Ренд. Он всегда не в духе, когда рано возвращается от нее. «К тому же завтра – пятница», – сообщил капитан, – «потрудитесь сделать до завтра!»
О! ВУЛКАНИАНЦЫ! У меня оставалось совсем мало времени, как Вселенский Разум подсказал мне, как сделать это быстро, качественно и уменьшить число строк до двух. А затем я сам уменьшил объем метода до одной строки. Теперь код выглядел так:
function updatePolls($pid, $poll_vote_id){
return $this->db->query('UPDATE polls_data SET num_votes=num_votes+1 WHERE poll_id='.$pid.' AND id='.$poll_vote_id);
}
Вот так значительно лучше! Я воспользовался секретом MySQL – можно прибавлять любое число к ячейке (да хоть ко всей таблице), даже из другой ячейки! Это была мудрая мудрость, которую я хочу записать в Бортовом Журнале, чтобы в дальнейшем, если что, обратиться к этой тайне.
На ночь капитан Кирк захотел черный чай с лимоном. Знал бы он, что мы, вулканианцы, не выносим лимонной кислоты…
Сентябрь 29th, 2009 в 14:41
Отличная статья! Не знал, что так можно. Спасибо, буду теперь использовать
Сентябрь 30th, 2009 в 11:26
Thanks, Mr.Spock!
Сентябрь 30th, 2009 в 11:48
+1
Сентябрь 30th, 2009 в 12:17
сейчас проверю
Сентябрь 30th, 2009 в 12:57
Не знал надо будет попробовать
Сентябрь 30th, 2009 в 13:20
thanks!
Октябрь 12th, 2009 в 01:12
Мне очень нравится заметка, очень много полезной инфы. Запишу себе в память.