Обновление столбца на основе значений двух других столбцов - PullRequest
0 голосов
/ 15 октября 2018

У меня есть таблица user_contents.Вот DDL

CREATE TABLE `user_contents` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `content_type` int(11) NOT NULL,
  `order_id` int(11) DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`),
  CONSTRAINT `user_contents_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
)

order_id - это недавно добавленный столбец.Мне нужно обновить значения order_id на основе значений content_type и user_id.content_type может быть 0 или 1.

Expected Result

На основе content_type и user_id я должен обновить order_id, как показано в приведенном выше результате.Для того же user_id и content_type order_id необходимо увеличить с 0.

Может ли кто-нибудь помочь мне с запросом на обновление

Я использую mysql db версии 5.7.23-0ubuntu0.16.04.1

Редактировать: - - Теперь требование немного изменено.Вместо data_type int для user_id он заменяется на значения типа varchar, такие как DAL001, HAL001 и т. Д.

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

Попробуйте следующий запрос, чтобы обновить order_id значения.При этом используются определяемые пользователем переменные сеанса .

Этот запрос в основном состоит из двух частей.Первая часть определяет order_id для каждого id на основе определенной логики.

Вторая часть соединяется с таблицей user_contents с использованием id и обновляет значения order_id.

UPDATE user_contents AS uc 
JOIN 
(
  SELECT 
    dt.id, 
    @oid := IF(@uid = dt.user_id AND 
               @ct = dt.content_type, 
               @oid + 1, 
               0) AS order_id, 
    @uid := dt.user_id, 
    @ct := dt.content_type 
  FROM 
  (
    SELECT 
      id, 
      user_id, 
      content_type
    FROM user_contents 
    ORDER BY user_id, content_type
  ) AS dt 
  CROSS JOIN (SELECT @oid := 0, 
                     @uid := 0, 
                     @ct  := 0) AS user_init_params 
) AS dt2 ON dt2.id = uc.id 
SET uc.order_id = dt2.order_id  
0 голосов
/ 15 октября 2018
string SQL = "SELECT MAX(order_id) FROM user_contents 
WHERE user_id = 'label1' AND content_type ='label2'";

string sql = "UPDATE user_contents SET order_id='" +bb+ "' WHERE sl='1'";

После получения максимального идентификатора заказа увеличьте orderid и перейдите к некоторой переменной и обновите, используя запрос на обновление.

0 голосов
/ 15 октября 2018

Было бы лучше использовать вид, чтобы достичь того, что вы хотите.Вот один вариант, который должен работать без оконных функций и без переменных сеанса:

CREATE VIEW user_contents_view AS (
    SELECT
        id,
        user_id,
        content_type,
        (SELECT COUNT(*) FROM user_contents uc2
         WHERE uc2.user_id = uc1.user_id AND
               uc2.content_type = uc1.content_type AND
               uc2.id < uc1.id) order_id
    FROM user_contents uc1
);

enter image description here

Демо

Основная проблема с предложением сделать обновление здесь состоит в том, что столбец order_id, по-видимому, является производными данными.Это будет означать, что вам может потребоваться больше обновлений в будущем.Таким образом, представление полностью устраняет эту проблему, просто генерируя нужный вывод, когда он вам действительно нужен.

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