2011-07-16 12 views
1

自分のサイトで記事を検索するsearch.phpを作成しました。私がしようとしていたのは、記事の並び順を何票ずつ並べ替える投票システムを作ることでした。しかし、記事は1つのテーブルにあり、投票は別のテーブルにあります。だから、私が必要としたのは投票テーブルにある外来キーだったので、記事テーブルに何票の議決権があるのか​​調べることができました。外部キーヘルプ!

私の質問は、それはそれを扱うだろうか? 記事テーブルと投票テーブルに外部キーを設定する方法がわかりません

+0

現在、記事テーブルと投票テーブルにはどのような列がありますか? – Neil

+0

ユーザー(ユーザーは記事ごとに1回しか投票できません)投票と投票の結果---投票テーブル。記事テーブルには多くの行がありますが、困ったことにID、AuthorID、AuthorName、UpVote、DownVote(どちらも約5分前に追加されました) – capernicuzz

答えて

1

投票テーブルを挿入するときに、アーティースの投票数を更新するのはなぜですか? Articles(articleId, someText, ...)とその後Votes(articleId, userId, ...)

:あなたはテーブルが何であるかを私たちに語っていないので

あなたは私はあなたが2つのに似た列を持つ表を持っていると仮定し、答えを作る

<?php 
//vote.php 
require 'db.php'; 
if (mysql_num_rows(mysql_query("SELECT id FROM votes WHERE article_id = '".intval($_GET['aid'])."' AND ip = '".$_SERVER['REMOTE_ADDR']."'")) { 
    die("Already voted"); 
} 

mysql_query("INSERT INTO votes (id, ip, article_id) VALUES ('', '".$_SERVER['REMOTE_ADDR']."', '".$_GET['aid']."')"); 
mysql_query("UPDATE articles SET votes = votes ".($_GET['vote'] == "up" ? "+ 1" : "- 1")." WHERE article = '".intval($_GET['aid'])."'"); 
+0

ユーザーが記事ごとに1回だけ投票できるようにしたい – capernicuzz

+0

それは私の答えとは関係ありません。 3つのクエリを実行する:SELECT(ユーザーがすでに投票したかどうかを確認する) - >更新(アーティクルテーブル) - > Insert(投票テーブル) – genesis

+0

ユーザーのipaddressを複数回投票することを制限する方法はありますか?もしあれば、私は投票テーブルを必要とせず、記事テーブル – capernicuzz

1

のようにそれを使用することができますVotesのarticleIdをarticleのarticleIdを参照する外部キーに設定します。

1

記事

ID SUBJECT  CONTENT DATE_ADDED 
----------------------------------------------- 
1 | How to vote | text... | 14-07-2011 14:11:23 
2 | Rate me  | text... | 16-07-2011 09:04:56 

投票

ID ARTICLE_ID VOTE  IP   DATE_ADDED 
----------------------------------------------- 
1 |  1  | 3 | 184.153.2.62 | 14-07-2011 15:02:23 
2 |  1  | 1 | 211.182.31.74 | 14-07-2011 16:11:51 

あなたは、上記の(または類似)のように設定し、あなたのテーブルを持っている場合は、あなたのMYSQLスクリプトで外部キー制約を作成することができますとして:

CREATE TABLE articles (id INT NOT NULL, 
         subject VARCHAR(255), 
         content TEXT, 
         date_added DATETIME, 
        PRIMARY KEY (id) 
) ENGINE=INNODB; 
CREATE TABLE votes (id INT, 
        article_id INT, 
        vote TINYINT, 
        ip VARCHAR(15), 
        date_added DATETIME, 
        FOREIGN KEY (article_id) REFERENCES articles(id) 
         ON DELETE CASCADE 
) ENGINE=INNODB; 
1

これは、私が使用することを選択した列ではありません。

投票には、a)どの記事b)どのユーザーが投票したか、または投票したかを知る必要があります。だから、ArticleID(Articleテーブルへの外部キー)、UserIDとVote(1または-1)があります。その後、SELECT ArticleID, SUM(Vote) AS TotalVote FROM Votes GROUP BY ArticleIDは各記事の合計投票を表示し、必要に応じてソートすることができます。

でも記事を検索しているので、ArticleIDを使用して記事テーブルから投票テーブルへの左結合をしたいと思うでしょう。記事がまだ投票していない場合はがNULLになるので、代わりにIFNULL(SUM(Vote), 0)を使用する必要があります。