MySQL Join Issue - PullRequest
       2

MySQL Join Issue

0 голосов
/ 12 августа 2011

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

Я уже сужаю результаты по ряду критериев, но мне нужно отфильтровать его также по проценту выборов, в которых проголосовал тот или иной избиратель с момента его регистрации.У меня есть все голоса, год их регистрации, и что каждые 4 года проводятся 3 выборы.Я пытался сделать подзапрос для фильтрации результатов, но это заняло слишком много времени.Потребовалось 10 минут, чтобы вернуть 10 записей.Я должен сделать это каким-то образом в соединении, но я совсем не разбираюсь в соединениях.

Это в основном то, что мне нужно сделать:

  SELECT * FROM voters 
     WHERE (number of votes voter has) >= (((year(now())-(registration_year) ) * 3/4)
     * (percentage needed))

Все этодовольно просто.Хитрость заключается в подсчете голосов избирателей из базы данных голосов.Есть идеи?

Ответы [ 5 ]

0 голосов
/ 13 августа 2011

Я бы порекомендовал создать представление, а затем смоделировать ваше соперничество для получения данных

0 голосов
/ 12 августа 2011

Как насчет этого:

SELECT voters.* FROM voters
     LEFT JOIN (SELECT COUNT(voterid) AS votes,voterid AS id FROM votes) AS a
         ON voters.id = a.id
     WHERE a.votes >= (((year(now())-(voters.registration_year) ) * 3/4) * percentage
0 голосов
/ 12 августа 2011

Я бы не стал вычислять это как часть вашего запроса

В случае, если эта информация будет меняться только 3 раза за четыре года, я бы добавил поле% проголосовавших в таблицу избирателей и вычислял его один раз после каждых выборов. Тогда вы можете просто фильтровать по полю.

0 голосов
/ 12 августа 2011

вы можете добавить поле voice_count в таблицу избирателей и произвести подсчет обновлений. Возможно, вы захотите сделать это прямым SQL-запросом: Агрегирующая функция в запросе обновления SQL?

Кроме того, я не уверен, достаточно ли умен mysql для оптимизации, но не используйте year (now ()): вы можете либо получить это значение в PHP, либо просто жестко его кодировать при каждом запуске (вы вероятно, не нужно запускать его слишком часто).

0 голосов
/ 12 августа 2011

Либо создайте другую таблицу, либо добавьте в свою первую таблицу (содержащую информацию об избирателях, но не их голоса) два столбца - #votes и registrationAge. Затем вы можете обновить эту таблицу, отсканировав таблицу «голосов» один раз - каждый раз, когда вы сталкиваетесь с голосованием, просто увеличивайте счет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...