2009-12-29 3 views
-1

У меня есть сайт для размещения файлов, где я предоставляю точку для каждой уникальной загрузки пользователю.Лучший запрос на обновление для таблицы mysql

Образец моей таблицы
Sample table http://i47.tinypic.com/venok0.png

Эти пункты могут быть погашены пользователем. Так, например, если пользователь выкупит 100 пунктов, чем лучший запрос на уменьшение количества баллов, доступных в каждой строке, до 100 пунктов.

Thank you.

+1

Мне непонятно, что вы хотите сделать. Пожалуйста, объясните немного больше. – Natrium

+1

Как вы определяете, какие загрузки следует вычитать с самого начала? Вы начинаете с самого нового? Начиная со старым? Тот, у кого больше всего очков? Или вы пытаетесь вычитать очки равномерно из всех? –

+0

@Jordon => Может быть вычтена из любого заказа – Shishant

ответ

2

Хорошо, тогда это SQL-тупой способ сделать это. Надеюсь, что гуру SQL придет лучшее решение. Примечание: Это чистый псевдокод; напишите свой собственный код на основе этого - он не будет работать из коробки.

$total_to_deduct = 100; 

// Each time, get the row with the highest points 
$top_points_query = "SELECT id, points FROM my_table ORDER BY points DESC LIMIT 1;" 

do { 
    $result = do_query($top_points_query); 

    if($result) { 
    // I'm assuming you don't want to deduct more points from a row than it has 
    $num_to_deduct = min($result['points'], $total_to_deduct); 

    // Now deduct the points from the row we got earlier 
    $update_query = "UPDATE my_table SET points = points - $num_to_deduct 
        WHERE id = $result['id']"; 

    if(do_query($update_query)) { 
     $total_to_deduct -= $num_to_deduct; 
    } 
    } 
} while($total_to_deduct > 0); // If we still have points to deduct, do it again 
0

Просто добавьте столбец в свою пользовательскую таблицу с количеством искупленных очков. Это жизнеспособное решение для вас?

+0

Нет, Лучше всего было бы сократить, потому что все приложение готово, и оно полагается на эту структуру таблицы, и если ее изменение означает, что все, что должно было быть изменено. – Shishant

+0

Затем прочитайте комментарий Jordans :-) –

+1

, если все приложение готово, почему вы все еще кодируете? ;-) – Natrium

3

Вы должны создать две таблицы для этого:

Table files 
- id 
- name 
- size 

Table points 
- id 
- file_id 
(- user) 
- points 

Вставьте новый файл:

INSERT INTO files (name, size) VALUES ('kat92a.jpg', 105544); // New file with ID 1 

Теперь вы можете дать указывает на файл, отрицательным или положительным:

INSERT INTO points (file_id, points) VALUES (1, 100); //Positive points 
INSERT INTO points (file_id, points) VALUES (1, -10); //Negative points 

И вы можете выбрать общее количество баллов:

SELECT 
    files.name, 
    files.size, 
    (SELECT sum(points) FROM points WHERE file_id = 1) AS points 
FROM files 
WHERE id = 1 
+0

Довольно хорошая логика – Shishant

0

Вот чистое решение SQL, но я предупреждаю вас, что (а) это непроверенные и (б) это просто концепция.

DECLARE curs CURSOR FOR 
    SELECT 
     id, 
     points, 
    FROM 
     points 
    WHERE 
     points > 0; 

DECLARE CONTINUE HANDLER FOR NOT FOUND SET remPoints = 0; 
OPEN curs; 

SET remPoints = 100; /* modify this value, probably in your app */ 

REPEAT 
    FETCH curs INTO cId, cPoints; 

    IF remPoints >= cPoints THEN 
     UPDATE points SET points = 0 WHERE id = cId; 
    ELSE 
     UPDATE points SET points = points - remPoints WHERE id = cId; 
    END IF; 
    SET remPoints = remPoints - cPoints; 
UNTIL remPoints <= 0; 

CLOSE curs; 
1

Похоже вам просто нужно простое заявление обновление и позволяет обновлять строку и, если это более чем 100 не обновлять его.

update table set points = if((points+<VALUE>) <= 100,points+<VALUE>,points) where id = <FILE ID> 

Это будет проверять, если точки выше 100, если это то оператор обновления не будет просто возвращать никаких результатов. Если значение меньше 100, то оно обновит таблицу и вернет вам количество строк, которые были обновлены.

+0

Я не знал, что подобные инструкции могут быть написаны для sql, можете ли вы рассказать мне, что должно быть вставлено в Shishant

+0

Значение - это количество очков, которые вы собираетесь назначить этому столбцу. Итак, если пользователь, загружающий файл, будет использовать 15 пунктов, тогда VALUE должно быть 15. – RaginBajin

+0

Извините, что это не то, что я хотел, я хочу вычесть очки из строк до 100 баллов. Так что, если одна строка имеет более 100 баллов, вычитайте ее или продолжайте вычитать до 100 очков. – Shishant

Смежные вопросы