Установите задание cron для обновления информации о статье в зависимости от ее значений голосов - PullRequest
0 голосов
/ 23 декабря 2011

Я хочу установить задание cron, которое будет выполняться каждые 15 минут. Прежде чем углубляться в описание этого запроса, я объясню, как работает моя база данных.

У меня есть 2 таблицы ' истории ' и ' голосов '. Вся информация о статье, такая как название, категория и т. Д., Хранится в таблице « Stories ». Неудивительно, что все голоса, относящиеся к статье, хранятся в таблице « голос ». В таблице голосований есть поле с именем « item_name », которое соответствует « id » статьи, которая находится в таблице «истории». Наконец, в таблице ' story ' у меня есть поле с именем ' показывая ', которое по умолчанию установлено на 0. И я хочу изменить его на разные значения в зависимости от того, сколько голосов статья имеет, но больше об этом позже.

Вот структура моей базы данных:

Таблица рассказов

enter image description here


Таблица голосов

enter image description here


Хорошо, теперь, когда я очистил структуру базы данных, давайте перейдем к моему вопросу. Мне нужен запрос, который бы просматривал все статьи с показом = 0 и суммировал голоса, которые соответствуют конкретной статье. Если сумма голосов = 10, то заданное значение = 1, если сумма голосов = -10, чем заданное значение = 2. Я не знаю, как будет выглядеть такой запрос, я действительно не знаю: / Так может кто-нибудь предложить решение, пожалуйста?

Дополнение: Я задавал подобный вопрос раньше, и некоторые люди предлагали триггер или обновлять базу данных каждый раз, когда голосуют. Но я бы лучше проверял это каждые 15 минут с помощью cron. )))

РЕДАКТИРОВАТЬ: Просто чтобы дать вам больше понимания того, как это работает)))

Например, эта строка из таблицы «историй»:

id | 12
st_auth | имя автора
st_date | дата истории
st_title | название истории
st_category | категория истории
st_body | тело истории
показывает | 0 для ожидающих, 1 для утвержденных и 2 для не утвержденных

Co отвечает на этот вопрос из таблицы голосов:

id | 83
item_name | 12 (идентификатор статьи)
voice_value | 1 для upvote -1 для downvote и т.д ...

Ответы [ 2 ]

1 голос
/ 23 декабря 2011
select sum(vt.vote_value), vt.item_name
from Votes vt
join stories st on st.id = vt.item_name
and st.showing = 0
group by vt.item_name

Это должно дать вам все статьи с указанием 0 и общей стоимости голосования.После этого вы можете обрабатывать их построчно и обновлять голосование, если это необходимо.

Добавлено: я не программист PHP, в основном я использую PERL, но я полагаю, что-то вроде этого:1005 *

1 голос
/ 23 декабря 2011

Я не уверен, полностью ли я понимаю ваш вопрос, но то, что я получаю, это:

<?php
    //this is placed after connecting to and selecting your mysql database
    $query = "SELECT * FROM `stories` WHERE `showing` = 0";
    $result = mysql_query($query);
    while($row = mysql_fetch_array($result))
    {
        //count how many votes we have
        $query2 = "SELECT * FROM `votes` WHERE `item_name` = '".$row['id']."'"; //assuming item_name in votes = id in stories
        $result2 = mysql_query($query2);
        $ourCount = 0;
        while($row2 = mysql_fetch_array($result2))
        {
            $ourCount = $ourCount + $row['vote_value'];//assuming vote value is where your +1 or -1 or whatever value is stored.
        }

        if($ourCount >= 10)
        {
            //I'm assuming, you want to show it if the votes equal or are greater than 10...
            $query3 = "UPDATE `stories` SET `showing` = 1 WHERE `id` = '".$row['id']."'";
            mysql_query($query);
        } else if($ourCount <= -10) {
            //again i'm assuming you want to set 2 where votes is equal to or less than -10
            $query3 = "UPDATE `stories` SET `showing` = 2 WHERE `id` = '".$row['id']."'";
            mysql_query($query);
        } else {
            //you can really take this part out as it's redundant, but i'm placing it here anyways.
            $query3 = "UPDATE `stories` SET `showing` = 0 WHERE `id` = '".$row['id']."'";
            mysql_query($query);
        }
    }
?>

То, что это делает, получает все строки из "историй", где "показ" = 0. Затем он ищет голоса для любого item_name со значением идентификатора истории. Оттуда, это добавляет "item_value", который может быть отрицательным для отрицательных голосов. Затем он выясняет, является ли конечный результат больше, чем равно 10, меньше, чем равно -10 или (-10,10). Затем он выполняет соответствующий запрос, чтобы установить показ на 1, 2 и 0 соответственно.

Надеюсь, я правильно понял ваш вопрос!

...