Выборка данных с БД при условии

267
03 июня 2017, 15:35

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

Имеется таблица в БД в которой есть 4 столбца:

| id | Name | Status | Quantity |
+----+------+--------+----------+

Через PHP я добавляю в БД данные скажем о фруктах, их состоянии и количестве.

В идеале должно получаться так:

| id | Name | Status | Quantity |
+----+------+--------+----------+
|  1 | Appl |  Good  |    10    |
|  2 | Appl |  Bad   |    4     |
|  3 | Appl |  Mell  |    42    |
|  4 | Pear |  Good  |    11    |
|  5 | Pear |  Mell  |    15    |
|  6 | Pear |  Bad   |    2     |
......

И список таких фруктов около 10,000. Время от времени я добавляю в таблицу не достающие фрукты, так как НЕТ возможности сделать Unique столбец, я перед добавлением делаю проверку через PHP с запросами в БД, если такой фрукт есть - то не добавлять, если нету - то добавить.

Но в один прекрасный день, что-то пошло не так и моя проверка не сработала, в итоге в БД появились задублированные данные к примеру:

| id | Name | Status | Quantity |
+----+------+--------+----------+
|  1 | Appl |  Good  |    10    |
|  2 | Appl |  Bad   |    4     |
|  3 | Appl |  Mell  |    42    |
| 141| Appl |  Good  |    10    |
| 142| Appl |  Bad   |    4     |
| 143| Appl |  Mell  |    42    |
......

Теперь соответственно есть 2 варианта развития событий:

  1. Написать запрос в БД который будет находить повторяющиеся строки по Name и Status и удалять строки с наименьшим ID. Т.е. находит 2 строки |2|Appl|Bad|4| и |142|Appl|Bad|4|, у второй строки ID больше, значит удалить первую строку.

  2. Написать запрос, который через PHP будет вытягивать с БД значения с наибольшим ID.

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

Answer 1

Удалите дубликаты и создайте уникальный индекс по двум полям:

CREATE UNIQUE INDEX Table_Name_Status_uindex ON table (Name, Status);

При инсерте обрабатывайте исключение.

Answer 2

Вот второй вариант

SELECT MAX(id), name status, quantity FROM `table` WHERE 1 group by name, status, qty
READ ALSO
Вывод статистики переходов по ссылке

Вывод статистики переходов по ссылке

Помогите пожалуйста разобраться с выводом статистики переходов, сильно не ругайте, делаю первые шаги в освоении кода

325
Как лучше реализовать бизнес логику в Spring MVC?

Как лучше реализовать бизнес логику в Spring MVC?

ПриветПишу свой первый проект на Spring(онлайн банк)

353
Цикл for и деление на массивы командой split

Цикл for и деление на массивы командой split

есть табличка html, она может быть разной длины:

344