В настоящее время у меня есть jQuery upvote Plugin в моем проекте. Таким образом, каждый раз, когда я нажимаю кнопку "вверх", он сохраняет значение в db как истинное, и каждый голос возвращается обратно, сохраняет значение как false в базе данных и сохраняет значение в другом столбце как 0. Все, что я пытался сделать, это чтобы подсчитать общее количество голосов, как и переполнение стека. Даже сейчас я так запутался в том, как решить эту проблему. Я в конечном итоге делаю этот код в php, что также замедляет работу всей моей программы:
$sample1 = $this->db->prepare("SELECT * from Ratings WHERE TopicID = :current");
$sample1->bindParam(':current', $id);
$sample1->execute();
$RES1 = $sample1->fetchAll(PDO::FETCH_ASSOC);
$upVote = 0;
foreach ($RES1 as $mk){
if(($mk['Upvote'] === 'true') && ($mk['Downvote'] ==='false')){
$upVote++;
}
else if(( $mk['Upvote'] ==='false') && ($mk['Downvote'] === 'true')){
$upVote--;
}
else if(($mk['Upvote'] === 'false') && ($mk['Downvote'] === 'false')){
$upVote--;
}
else if(($mk['Downvote'] === 'false')){
$upVote++;
}
else if(($mk['Downvote'] === 'true') && ($mk['Upvote'] ==='0') || ($mk['Upvote'] === 'false')){
$upVote--;
}
}
Моя структура таблицы:
Для приведенного выше примера мой счетчик должен быть 0
Я думаю, что с небольшим количеством исследований условия, которые вы показываете, чтобы решить, вверх или вниз, могут быть упрощены. Но вот инструкция SQL, которая реализует ваши условия:
SELECT
SUM(
IF(Upvote='true' AND Downvote='false',1,
IF(upvote='false' AND Downvote='true',-1,
IF(Upvote='false' AND Downvote='false',-1,
IF(Downvote='false',1,
IF(Downvote='true' AND (Upvote='0' OR Upvote=false),-1,0)
)
)
)
)) as 'votes'
FROM Ratings
WHERE TopicD = :current
Если считать только "истинные" значения, это может сделать трюк:
SELECT
SUM(IF(Upvote='true',1,0)) - SUM(IF(Downvote='true',1,0)) as 'votes'
FROM Ratings
WHERE TopicD = :current