考慮下面的設置;
users
+------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+----------------+
| user_id | smallint(5) | NO | PRI | NULL | auto_increment |
| username | varchar(10) | NO | | NULL | |
+------------+-------------+------+-----+---------+----------------+
... You'll have more columns, but you get the idea
-
questions
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| qid | smallint(5) | NO | PRI | NULL | auto_increment |
| question | varchar(10) | NO | | NULL | |
| votes | smallint(5) | NO | | 0 | |
+----------+--------------+------+-----+---------+----------------+
-
votes
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| qid | smallint(5) | NO | | NULL | |
| user_id| smallint(5) | NO | | NULL | |
+--------+-------------+------+-----+---------+-------+
在此設置中,我的用戶ID 1和投票的問題ID 1
當用戶投票,其投票置於votes
INSERT INTO `votes` (`qid`,`user_id`) VALUES (1, 1);
要檢查他們已經投了票,只需做;
SELECT `user_id` FROM `votes` WHERE (`user_id`=1) AND (`qid`=1);
如果該查詢返回任何行,我們知道用戶已經投票,我們不應該處理重複的投票。
當然,這隻會限制我們選擇一種投票類型 - 正面或負面 - 無論您決定跟蹤哪種類型。我們可以修改votes
來存儲它的投票類型;
ALTER TABLE votes ADD type ENUM('up', 'down') NOT NULL DEFAULT 'up';
這將使我們的表結構如下;
+---------+-------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------------+------+-----+---------+-------+
| qid | smallint(5) | NO | | NULL | |
| user_id | smallint(5) | NO | | NULL | |
| type | enum('up','down') | NO | | up | |
+---------+-------------------+------+-----+---------+-------+
然後,再次調整查找查詢;
SELECT `user_id` FROM `votes` WHERE (`user_id`=1) AND (`qid`=1) AND (`type`='up');
這是一個很好的做法,使用PRG(Post Redirect Get)來(主要)避免這個問題。 –
@Jack:在我的情況下,PRG沒有用,因爲我在後臺更新分數,並且無法將他重定向到頁面。我想實現類似於堆棧溢出的評分系統 –
@InsaneCoder在我的回答中閱讀我的最新評論,如果您不需要一段時間就可以創建一個包含questionID和accountID的表,並使用與accountID和currentQuestionID匹配的WHERE子句獲取結果。如果返回的行大於0,則不能再添加分數,因爲用戶已經評分。 – Steini