Внешний ключ, помогите! - PullRequest
1 голос
/ 17 июля 2011

Я создал search.php, который находит статьи на моем сайте.Я пытался создать систему голосования, которая бы сортировала статьи по количеству полученных голосов.Но статьи находятся в одной таблице, а голоса - в другой.Так что мне нужен был внешний ключ, который был бы в таблице голосования, который бы сообщал таблице статей, как много голосов «за» он имеет, так что search.php отсортировал бы соответственновнешний ключ, который бы справился с этим?Я просто не знаю, как настроить внешний ключ в таблице статей и таблице голосования

Ответы [ 4 ]

1 голос
/ 17 июля 2011

Это не те столбцы, которые я бы выбрал для использования.

Для голосования необходимо знать a) какая статья b) какой пользователь c) проголосовали ли они за или против. Таким образом, у меня будет ArticleID (который является вашим внешним ключом к вашей таблице Article), UserID и голосования, которые будут либо 1, либо -1. Затем SELECT ArticleID, SUM(Vote) AS TotalVote FROM Votes GROUP BY ArticleID сообщит вам общее количество голосов по каждой статье, и вы можете отсортировать, если хотите.

Но так как вы также ищете статьи, вы можете использовать ваш ArticleID, чтобы присоединиться слева от таблицы статей к таблице голосов. Обратите внимание, что в этом случае SUM(Vote) будет NULL, если ваша статья еще не имеет голосов, поэтому вам, возможно, придется использовать IFNULL(SUM(Vote), 0).

1 голос
/ 17 июля 2011

Поскольку вы не сказали нам, что это за таблицы, я отвечаю, предполагая, что у вас есть 2 таблицы со столбцами, подобными этим: Articles(articleId, someText, ...) и Votes(articleId, userId, ...)

Затем вы устанавливаете articleId в Votes для внешнего ключа, ссылающегося на articleId в Articles.

1 голос
/ 17 июля 2011

Таблица Статьи

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 голос
/ 17 июля 2011

А почему бы вам просто не обновить счетчик голосов ваших статей при добавлении строки в таблицу голосов?

Вы можете использовать его как

<?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'])."'");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...