0

現在、自分のWebサイトの投票モジュールを作成していますが、ユーザーがすでに投票したかどうかを確認する必要があります。投票ログから*を選択するだけで、スクリプトによって投票ごとに新しいレコードが挿入されるため、サイト1で投票するとします。別の記録、そしてあなたがサイト2に投票したかどうかを言います。

列はサイトとユーザー名です。1つのphpmysqlクエリでユーザー名に基づいてすべてのサイトに投票したかどうかを確認できませんSELECT*FROM TABLE_NAME

そして、そのように情報を整理しますが、頭を包むことはできません。

いつものようにどんな助けもありがたいです!

4

1 に答える 1

0

設定方法は次のとおりです。

ユーザー テーブル:

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 インジェクション攻撃を避けるために、クエリのユーザー入力を必ず引用してください。

于 2012-08-08T20:23:33.503 に答える