mysql выбрать отличительные и отбросить другие - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть эта таблица, и я хочу пометить весь первый элемент как ОК, а все остальные элементы как отклоненные в таблице mysql и изменить их статус на Не хорошо

можем ли мы выполнить этот один запрос для каждого продукта используя PHP ??

вот структура таблицы

id      prod_id   position  status 

3056620 4610395144282   20  0
3056619 4610395144282   7   0
3020612 4610395144282   19  0
3020611 4610395144282   7   0
3020610 4610395144282   6   0
2996086 4610395144282   17  0
2996085 4610395144282   6   0
2996055 4610395144282   17  0
2996054 4610395144282   6   0
2994301 4610395144282   29  0
2994300 4610395144282   16  0
2994299 4610395144282   6   0
2994279 4610395144282   26  0
2994278 4610395144282   19  0
2994277 4610395144282   15  0
2994276 4610395144282   11  0
2994275 4610395144282   6   0
2989321 4610395144282   24  0
2989320 4610395144282   22  0
2989319 4610395144282   19  0
2989318 4610395144282   17  0
2989317 4610395144282   13  0
2989316 4610395144282   10  0
2989315 4610395144282   8   0
2989314 4610395144282   6   0

я хочу отметить все такие столбцы, где позиция prod_id повторяется как 1

Например, мы можем видеть, что Prod_id 4610395144282 позиция 7 появляется 2 раза, поэтому я буду игнорировать первое появление и пометить все остальные появления как 1 в статусе. следующая позиция 6 появляется несколько раз. я буду игнорировать первое появление или последнее появление и отмечать все остальные как status = 1 с той же позицией для того же продукта.

первая и последняя фильтруются по id. Order by id des c limit 1 любая помощь будет отличной. я могу получить уникальную строку, используя отличную, но как пометить других как статус 1. мы используем php и надеемся найти какой-нибудь быстрый способ

1 Ответ

0 голосов
/ 04 апреля 2020

Если вы используете MySQL версии 8.0 или выше, вы можете достичь этого с помощью оконных функций -

UPDATE YOUR_TABLE S
JOIN (SELECT *
      FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY position ORDER BY id) RN
            FROM YOUR_TABLE)
      WHERE RN = 1) T ON S.id = T.id
                     AND S.prod_id = T.prod_id
                     AND S.position = T.position
SET S.status = 1;

Если вы используете более низкие версии, вы можете сгенерировать row_number с подзапросом как -

UPDATE YOUR_TABLE S
JOIN (SELECT id, prod_id, position
      FROM (SELECT id, prod_id, @row_number:=CASE WHEN @position=position
                                                       THEN @row_number + 1
                                                  ELSE 1
                                             END AS rn, @position:=position position
            FROM YOUR_TABLE
            CROSS JOIN (SELECT @row_number :=0, @position := 1) vars
            GROUP BY position
            HAVING COUNT(position) > 1
            ORDER BY position) X
      WHERE RN = 1) T ON S.id = T.id
                     AND S.prod_id = T.prod_id
                     AND S.position = T.position
SET S.status = 1;

Демо.

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