MYSQL Как обновить таблицу, только если в другой таблице не существует пары уникальных ключей из двух столбцов? - PullRequest
0 голосов
/ 17 марта 2012

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

**Subject_Table**              

SID   Subject   Total_Votes          
1     Cows      5     
2     Chickens  3     


**Vote_Table**

VID   Subject   User    Voteup           
1     Cows      John    1     

Всего голосов равных голосов всех пользователей.Голосование может равняться 1, если за предмет проголосовали.Я создал уникальную пару значений с субъектом и пользователем со следующим утверждением без каких-либо проблем:

ALTER TABLE Vote_Table ADD UNIQUE limitvote(Subject,User);

При первом голосовании по теме выполняются следующие запросы:

$sql="INSERT INTO Vote_Table (Subject, User,Voteup) VALUES ('$Subject', '$User', '$Voteup') ON DUPLICATE KEY UPDATE up=1";
$q = "UPDATE Subject_Table SET Total_Votes = $votes_up= //current votes plus 1;

Даже если Джон проголосует дважды, голос всегда будет равен 1 в элементе Vote_Table, поскольку ON DUPLICATE KEY UPDATE up = 1.Но это не так в Subject_Table.Без ограничений Джон мог голосовать бесконечно.Ограничение должно быть парой субъект-пользователь.Ограничения не могут быть только субъектом или пользователем, так как Джон может голосовать за других субъектов, а другие пользователи могут голосовать за коров.

Как я могу проверить Vote_Table, чтобы увидеть, существует ли уникальная пара субъект-пользователь (Коровы и Джон)) до того, как я обновлю Subject_Table?

1 Ответ

1 голос
/ 17 марта 2012

Вы можете включить его в предложение WHERE:

UPDATE Subject_Table
   SET Total_Votes = Total_Votes + 1
 WHERE Subject = ...
   AND NOT EXISTS
        ( SELECT 1
            FROM Vote_Table
           WHERE Subject = ...
             AND User = ...
        )
;

Тем не менее, я не уверен, что вам действительно нужен Subject_Table вообще;Вы можете создать представление на Vote_Table, которое даст вам ту же информацию, без необходимости создавать отдельную таблицу.(См. статью в Википедии о нормализации базы данных .) Это может выглядеть так:

CREATE VIEW Subject_View AS
SELECT Subject,
       COUNT(1) AS Total_Votes
  FROM Vote_Table
 GROUP
    BY Subject
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...