MySQL - обновлять столбец представления каждый раз, когда выбирается строка - PullRequest
2 голосов
/ 18 июня 2009

У меня есть таблица со столбцом "view_count".

Я хотел бы увеличивать указанный столбец каждый раз, когда я выбираю строку (даже с помощью универсального SELECT, такого как SELECT * FROM table WHERE 1 .. Это увеличило бы на 1 view_count всех строк).

Есть ли способ сделать это автоматически "на стороне сервера" (где mysql - сервер, а мое приложение - клиент), то есть без обновления каждый раз?

РЕДАКТИРОВАТЬ: Поскольку несколько человек спросили меня, почему я хотел сделать это, и несколько неправильно поняли мой запрос, представьте, что это программное обеспечение форума, а таблица - таблица потоков. У каждого потока есть счетчик просмотров, и вы хотите обновлять его каждый раз, когда вы отображаете поток на главной странице (обычно я знаю, что счетчик просмотров потоков обновляется только тогда, когда вы его просматриваете, но это лучший пример, который я мог бы найти с, мой частный случай довольно длинный и сложный T_T)

Ответы [ 5 ]

6 голосов
/ 18 июня 2009

Не может быть сделано. По сути, вам нужен триггер на SELECT, а триггеры поддерживаются только для INSERT, UPDATE и DELETE. Самое близкое, что вы могли бы получить - это запустить все ваши взаимодействия с таблицей через хранимую процедуру, и, похоже, вы хотите, чтобы это поведение было реализовано при любых условиях.

1 голос
/ 18 июня 2009

Почему бы просто не выполнить одну инструкцию SQL следующим образом:

UPDATE tableName SET viewCount = viewCount + 1; SELECT tableName.col1, tableName.col2;

Это может быть даже легко создано динамически на любом языке.

0 голосов
/ 18 июня 2009

Хранимые процедуры, но это боль. Я бы реализовал безопасность в другом месте.

0 голосов
/ 18 июня 2009

Я не верю, что есть простой способ сделать это на стороне сервера; триггеры выполняются только для UPDATE, INSERT и DELETE.

0 голосов
/ 18 июня 2009

Вы можете сделать это в области действия сеанса:

SET @view_count := 0;

SELECT  v.*,
        @view_count := @view_count + 1 AS view_count
FROM    view

У вас будет увеличивающееся значение для каждой просматриваемой строки:

SELECT  q.*,
        @view_count := @view_count + 1 AS view_count
FROM    (
        SELECT  1 AS col
        UNION ALL
        SELECT  2 AS col
        ) q;

-- -- 
 1  1
 2  2

SELECT  q.*,
        @view_count := @view_count + 1 AS view_count
FROM    (
        SELECT  1 AS col
        UNION ALL
        SELECT  2 AS col
        ) q;

-- -- 
 1  3
 2  4

Однако при этом будут учитываться только просмотры в вашем сеансе, а не общее количество просмотров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...