2012-06-28 2 views
0

Следующий код используется в запросе на выборку записей. Он использует electors.ID, чтобы найти соответствующий элемент голосования. Intention из второй таблицы.mySQL-запрос с JOIN по последней записи не все записи

$criteria = "FROM voting_intention,electors WHERE voting_intention.elector = electors.ID AND voting_intention.pledge IN ('C','P') AND electors.postal_vote = 1 AND electors.telephone > 0" 

Проблема заключается в том, что некоторые избиратели будут иметь более одного залога в таблице voting_intentions.

Мне нужен он, чтобы соответствовать только последним voting_intention.pledge на основе поля votin_intention.date для каждого избирателя.

Каков самый простой способ его реализации.

Остальная часть кода:

function get_elector_phone($criteria){ 
    $the_elector = mysql_query("SELECT * $criteria ORDER BY electors.ID ASC"); while($row = mysql_fetch_array($the_elector)) { 
    echo $row['ID'].','; } 
} 

ответ

2

Вы можете использовать суб-выбора с функцией MAX(). Добавьте следующее в свой пункт WHERE.

AND voting_intention.date = (select MAX(date) 
         from voting_intention vote2 
         where voting_intention.elector = vote2.elector) 

Вот SQLFiddle of the results.

+1

Человек разговаривает мой язык. Я не знал, что SQLFiddle очень хорош –

+0

Да, точно так же, как JSFiddle. Я люблю использовать его, потому что он позволяет мне проверять мои ответы, прежде чем просто бросать их туда. Кроме того, он позволяет отправителю проверить ответ и даже попробовать другие изменения. – Seth

+0

Один небольшой отказ от ответственности ... этот ответ зависит от индивидуальных избирателей, не имеющих нескольких строк в таблице vote_intention с той же датой. Основываясь на вашем наименовании, я предположил, что это было маловероятно. – Seth

1

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

Попробуйте выбрать следующие вместо voting_intention (из ответа связанного вопроса, некоторые таблицы и имена полей заменены):

SELECT voting_intention.* 
FROM voting_intention 
INNER JOIN 
(
SELECT elector, MAX(date) AS MaxDate 
FROM voting_intention 
GROUP BY elector 
) groupedintention ON voting_intention.elector = groupedintention.elector 
AND voting_intention.date = groupedintention .MaxDate 

Вопрос URL: How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL?

Смежные вопросы