外键帮忙!

时间:2011-07-16 22:55:31

标签: php mysql foreign-keys

我制作了一个search.php,可以在我的网站上找到文章。我试图做的是建立一个投票系统,根据投票数量对文章进行排序。但这些文章在一个表格中,而投票在另一个表格中。所以我需要的是一个外键,它将在投票表中告诉文章表它有多少票,所以search.php会相应地排序

我的问题是,我如何设置一个可以处理的外键? 我只是不知道如何在文章表和投票表中设置外键

4 个答案:

答案 0 :(得分:1)

为什么不在向投票表中插入一行时更新您的artices的投票数?

您可以像

一样使用它
<?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'])."'");

答案 1 :(得分:1)

由于您没有告诉我们这些表格是什么,我假设您有2个表格,其中包含与此类似的列:Articles(articleId, someText, ...)Votes(articleId, userId, ...)

然后,您将投票中的articleId设置为引用文章中articleId的外键。

答案 2 :(得分: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;

答案 3 :(得分:1)

这些不是我选择使用的列。

对于投票,您需要知道a)哪个用户c)哪个用户c)他们是投票还是投票。所以我会有一个ArticleID(这是你的Article表的外键),UserID和Vote,它们可以是1或-1。然后SELECT ArticleID, SUM(Vote) AS TotalVote FROM Votes GROUP BY ArticleID会告诉您每篇文章的总投票数,如果您愿意,可以进行排序。

但是既然你也在搜索文章,你会想要使用你的ArticleID从你的文章表到你的投票表进行左连接。请注意,在这种情况下,SUM(Vote)如果您的文章尚未投票,则NULL将为IFNULL(SUM(Vote), 0),因此您可能需要使用{{1}}。