設定方法は次のとおりです。
ユーザー テーブル:
CREATE TABLE users(
userid INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
UNIQUE INDEX(username)
);
サイト テーブル:
CREATE TABLE sites(
siteid INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
sitename VARCHAR(50) NOT NULL,
UNIQUE INDEX(sitename)
);
投票表:
CREATE TABLE votes(
timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
userid INT UNSIGNED NOT NULL,
siteid INT UNSIGNED NOT NULL,
UNIQUE INDEX(userid,siteid)
);
ユーザーが投票すると:
INSERT INTO votes(userid,siteid) VALUES ("$userid","$siteid")
ユーザーが投票したサイトを確認するには:
SELECT sites.sitename FROM sites
INNER JOIN votes ON sites.siteid=votes.voteid
WHERE votes.userid="$userid"
ユーザーが投票していないサイトを表示するには (行が返されない場合、ユーザーはすべてのサイトに投票しています)。
SELECT sitename FROM sites
WHERE siteid NOT IN (
SELECT siteid FROM votes WHERE userid="$userid"
)
ユーザーが投票していないサイトを表示できるため、このソリューションが気に入っています。
いくつかの最終的な注意事項:(1)本番環境では「SELECT * FROM table」を絶対に使用しないでください。これはひどいパフォーマンスです。常に必要な行だけを選択してください。(2) SQL インジェクション攻撃を避けるために、クエリのユーザー入力を必ず引用してください。