Извлечение самой последней записи в таблице базы данных с определенным значением

#php #mysql

#php #mysql

Вопрос:

У меня есть таблица с тремя полями — userId, CouponID, last_couponID.

Когда пользователь обращается к купону, я запускаю этот запрос:

   mysql_query("INSERT INTO users_coupons (userID, couponID) VALUES ('$recordUserID', '$recordCoupID')");
  

Кроме того, у меня есть другой запрос, который должен вставить последний идентификатор CouponID в поле last_couponID, путем опроса таблицы базы данных и нахождения самого последнего результата для текущего идентификатора пользователя.

Я полагаю, что это так:

  SELECT couponID FROM users_coupons ORDER BY userID LIMIT 1
  

Я прав? Или мне следует использовать другой запрос?

Вот так:

 userID   couponID
  1         3
  1        13
  1        23
  2         5
  2         3
  

Итак, если бы я хотел получить последний купон на идентификатор пользователя 2, это было бы ‘3’, а для идентификатора пользователя 1 это было бы ’23’. Я просто хочу последнюю запись в таблице базы данных, где идентификатор пользователя соответствует указанному мной значению.

Комментарии:

1. Если вы открыты для этого, вы могли бы добавить другое поле с отметкой времени и сделать: SELECT couponID FROM users_coupons ORDER BY time_field DESC LIMIT 1

Ответ №1:

Я бы просто добавил первичный ключ (автоматическое добавление) в таблицу users_coupons.

Когда вам нужен последний купон пользователя,
SELECT couponID FROM users_coupons WHERE userID = ? ORDER BY id DESC LIMIT 1

Ответ №2:

Предполагая, что CouponID является числовым, а последний CouponID для определенного userId является наибольшим (в виде числа), вы можете сделать:

SELECT MAX(couponID) AS lastCouponId FROM users_coupons WHERE userId = <put here the user id>

РЕДАКТИРОВАТЬ: поскольку вы отредактировали свой вопрос, я отредактирую свой ответ.

Вы должны добавить первичный ключ с автоматическим увеличением, иначе вы не сможете точно знать, какая запись является последней. Когда я отвечал, я предположил, что последний купон для определенного userId был самым большим couponId . Вы уверены, что не можете просто заставить все работать таким образом?

Комментарии:

1. 1 для большинства случаев, но это допустимо только в том случае, если CouponID является autonum, увеличивается с увеличением, не реплицируется с любыми другими таблицами, в которых приращения работают по-другому.

2. Не я голосовал против, но я хочу отметить, что, судя по примеру OP, этот метод не будет работать. Max (CouponID) не обязательно является последним купоном, к которому обращался пользователь. (например, выше, пользователь № 2 обращался к купонам №5 и № 3, но последним обращался к №3)

Ответ №3:

Что-то вроде…

 SELECT couponID
FROM users_coupons
WHERE userID = <current user id>
ORDER BY <primary key of user_coupons table if it's an identity column> DESC
LIMIT 1
  

…более уместно. Ваш запрос в его нынешнем виде ничего не делает с «текущим» идентификатором пользователя.

Если вам действительно нужен самый высокий CouponID, то SELECT MAX(couponID)... как предложил Giacomo, это хорошая идея — в сочетании с проверкой соответствия идентификатора пользователя текущему идентификатору пользователя.

Ответ №4:

Ответ @Giacomo действителен, если вы надежно увеличиваете CouponID в качестве идентификатора. Если вы объединили данные или корректируете это значение любым другим способом, то это может быть неверно.

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

Я утверждаю, что «правильный» метод заключается также в сохранении DateTime