2009-11-27 5 views
1

Мне нужно получить последний вставленный продукт пользователем. Это то, что я придумалЕсть ли менее хакерский способ сделать это в MySQL?

$query = 'SELECT id 
       FROM products 
       WHERE user_id = ? 
       ORDER BY id DESC 
         LIMIT 1'; 

Это должно работа, потому что идентификатор автоматическое приращение. Для меня, однако, это кажется взломанным. Есть лучший способ сделать это?

Я не могу использовать mysql_last_insert_id() или что-то в этом роде, потому что мне нужен последний продукт определенного пользователя.

+0

изделия с desc; – bobobobo

ответ

4

Использование:

SELECT MAX(t.id) AS id 
    FROM PRODUCTS t 
    WHERE t.user_id = ? 

MAX является агрегатной функцией, возвращая максимальное значение указанный столбец. Поскольку запрос возвращает только один столбец - тот, который используется для агрегатной функции, - необязательно указать условие GROUP BY. Но нет никакого вреда в использовании:

SELECT MAX(t.id) AS id 
    FROM PRODUCTS t 
    WHERE t.user_id = ? 
GROUP BY t.user_id 
+0

Это * немного лучше ... Я чувствую себя глупо за то, что забыл об этих вещах в MySQL. Благодаря! – alex

+1

Это отличное решение, но вы (alex) должны действительно рассмотреть возможность добавления поля «created» в вашу схему. Это действительно ценная колонка, если вы убедитесь, что ваши модели правильно заполняют ее. MySQL может сделать для вас выбор для сравнения даты, и это намного больше, чем самый лучший идентификатор записи для чего-то подобного. – coreyward

+0

Я согласен, но это модель данных Алекса, и вы должны проголосовать за Энди Уэстса, если вы согласны с ним. –

1

можно использовать

SELECT MAX(id) FROM ... 

Не уверен, насколько лучше это было бы, Тхо :)

5

Я бы добавил колонку DATETIME к вашей таблице для этой цели. Я лично не чувствую себя комфортно, полагаясь на поведение AUTO_INCREMENT с точки зрения заказа. Кроме того, его цель - «создать уникальный идентификатор для новых строк». Помимо этого, вы не должны заботиться о стоимости.

+0

Это хорошая идея ... как бы вы могли написать свой запрос, чтобы получить новейший продукт? – alex

+0

Предполагая, что в столбце DATETIME указано время добавления продукта (например, с помощью NOW()), вы можете просто заменить идентификатор в примере OMG Ponies на дату. –

+0

alex: как и ваш оригинал, но с ORDER BY datetime_column_name DESC, id DESC; – ysth

0

Я согласен с опцией Datetime Column. , например. Вы столбец с именем LastAddedDate DATETIME , то вы можете сделать запрос как

Выбор верхней (1) Products.Id из продуктов, где user_id = @ UserId порядок по LastAddedDate, Id Desc

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

Выберите верхний (1) Products.Id из продуктов где user_id = @ UserId порядка по Id Desc

+0

Вопрос задает MySQL, где нет SELECT TOP(). Альтернативой является LIMIT, о котором уже говорилось. –

Смежные вопросы