Ограничение данных mySQL как 5 записей столбца 2 на запись столбца 1 - PullRequest
1 голос
/ 21 сентября 2009

Привет, я новичок в mySQL, поэтому мое плохое знание языков может помешать мне найти нужный мне результат.

Я создаю простое приложение в CodeIgniter, которое будет обращаться к API Twitter и возвращать таблицу обновлений статуса для определенного числа различных пользователей. Я хотел бы ограничить показ 5 обновлениями на пользователя.

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

person   picture   update
john     pic 1     lorem ipsum
john     pic 1     lorem ipsum
john     pic 1     lorem ipsum
john     pic 1     lorem ipsum
john     pic 1     lorem ipsum
jim      pic 2     lorem ipsum
jim      pic 2     lorem ipsum
jim      pic 2     lorem ipsum
jim      pic 2     lorem ipsum
jim      pic 2     lorem ipsum
joe      pic 3     lorem ipsum
joe      pic 3     lorem ipsum
joe      pic 3     lorem ipsum
joe      pic 3     lorem ipsum
joe      pic 3     lorem ipsum
steve    pic 4     lorem ipsum
steve    pic 4     lorem ipsum
steve    pic 4     lorem ipsum
steve    pic 4     lorem ipsum

Я хотел бы ограничить количество обновлений на человека на пути к базе данных с помощью SQL-запроса.

Я использую INSERT IGNORE для своего запроса, так как при каждом обновлении страницы я не хочу вставлять дублирующиеся записи, а просто добавляю LIMIT 5 limit 5 для всего пользователя. Я просто хотел бы ограничить 5 на пользователя.

Есть ли простой способ сделать это? ЗАМЕНИТЬ НА? ОБНОВИТЬ? Суб-запросы?

Большое спасибо за любую помощь, которую вы могли бы оказать.

1 Ответ

0 голосов
/ 21 сентября 2009

Самый простой подход может быть с триггером на INSERT.

Это позволило бы логике приложения иметь дело только с отправкой INSERTS, когда это необходимо.

На стороне MySQL логика триггера удаляла бы все, кроме 4 самых последних (или любых других критериев) записей до вставки новой записи.

Это может быть что-то вроде этого: (примечание: непроверенные + опасения по поводу ограничения LIMIT во вложенном запросе, при необходимости можно найти альтернативный трюк.)

В этом фрагменте предполагается, что поле id будет доступно. Такое поле не показано в описании OP, но имело бы много смысла, так как такой PK делает операции CRUD намного проще (вместо написания составных ключей, здесь будут все 3 поля ...). Триггер можно сделать ПОСЛЕ ВСТАВКИ вместо этого, и это исключит возможность ненужного удаления некоторой записи, если новая запись будет дубликатом.)

CREATE TRIGGER LimitTweetUpdates BEFORE INSERT ON myTweeterTable
  FOR EACH ROW BEGIN
    DELETE FROM myTweeterTable
    WHERE person = NEW.person
    AND id NOT IN 
      (SELECT id FROM myTweeterTable  
       WHERE person = NEW.person
       ORDER BY id DESC
       LIMIT 5)
  END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...