2010-04-17 4 views
4

Я хочу выбрать самую последнюю запись из таблицы и посмотреть, совпадает ли эта запись с той, которую пользователь пытается ввести. Как сделать запрос «выбрать» из самой последней записи «публикации»?Как выбрать самую последнюю запись в mysql?

$query="Select * FROM 
     //confused here 
(SELECT * FROM posting ORDER BY date_added DESC) 
WHERE user_id='{$_SESSION['user_id']}' 
AND title='$title' 
AND price='$price' 
AND city='$city' 
AND state='$state' 
AND detail='$detail' 
"; 

$data = mysqli_query($dbc, $query); 
$row = mysqli_fetch_array($data); 
if(mysqli_num_rows($data)>0) 
{ 
    echo "You already posted this ad. Most likely caused by refreshing too many times."; 
    echo "<br>"; 
    $linkposting_id=$row['posting_id']; 
    echo "See the <a href='ad.php?posting_id=$linkposting_id'>Ad</a>"; 
} 
else 
{ 
     ...insert into the dbc 
     } 

//would this query work? or how do i use it to select the last ID in the table 'posting'? 
    $query="SELECT LAST_INSERT_ID(posting) 
    WHERE user_id='{$_SESSION['user_id']}' 
    AND title='$title' 
    AND price='$price' 
    AND city='$city' 
    AND state='$state' 
    AND detail='$detail' 
    "; 
+0

* (связанные) * http://stackoverflow.com/search?q=prevent+duplicate+posting+ php – Gordon

ответ

9

Часть заказа должна быть в конце вашего запроса. Таким образом, запрос вы просите что-то вроде этого:

select * from posting where .... order by date_added desc limit 1; 

Одноразовая форма лексемы могут помочь предотвратить дублированных тоже.

+0

Это вызовет проблемы, если два или более пользователей будут создавать объявления одновременно. Для этого потребуется другой столбец, который однозначно идентифицирует пользователя проводки для работы. –

+0

большое спасибо !!!! – ggfan

0

Ограничить ваш запрос к последнему (последней) записи с LIMIT 1

1

Вы обычно имеют уникальный идентификатор в вашей таблице и дать этот столбец auto_increment. Возможно, у вас уже есть такой идентификатор.

После этого вы можете получить идентификатор последней записи, используя mysql_insert_id() или mySQL LAST_INSERT_ID().

Последний предпочтительный вариант, поскольку в соответствии с руководством он хранит счет за соединение, поэтому другие процессы или веб-страницы не могут испортить счет между ними. В PHP-руководстве не совсем понятно, делает ли функция PHP одинаковой.

+0

У меня есть posting_id, который является auto_increment. Итак, как именно я использую last_insert_id() здесь? – ggfan

+0

@ggfan mm, теперь я вижу, что вы не создаете строку в том же файле. Может быть, что 'last_insert_id()' будет терпеть неудачу. Используйте решение @ grossvogel, но добавьте еще один столбец, который идентифицирует пользователя (например, идентификатор сеанса), чтобы предотвратить добавление других объявлений в то же время, закручивая ваш запрос. –

+1

Я считаю, что last-insert-id является специфичным для подключения. Таким образом, он позволяет получить этот идентификатор сразу после вставки в том же php-скрипте. Вы просите найти самую последнюю запись, потенциально вставленную другим процессом, поэтому она не будет работать здесь. Вы также должны соответствовать определенным критериям, например, не выбирать записи, вставленные другими пользователями. last_insert_id - отличная функция, но не для этого случая. – grossvogel

1

Я предлагаю создать уникальный ключ на вашем столе вместо того, чтобы делать то, что вы описали. Таким образом, вы избегаете дублирования контента независимо от того, сколько пользователей одновременно использует ваше приложение. Ваше решение потерпит неудачу, если A что-то вставляет, B вставляет что-то еще, затем A отправляет снова.

Пример добавления уникального ключа в существующую таблицу:

ALTER TABLE posting add UNIQUE KEY uk_posting (title, price, city) 

Заменить title, price, city с комбинацией полей, которые должны быть уникальными. Тогда все, что вам нужно сделать, это обработать ошибку при вставке.

+0

Хорошая идея, хотя это может быть слишком ограничительным, в зависимости от бизнес-требований. – grossvogel

3

на основе ваших комментариев, либо из следующих запросов будут получать единую последнюю запись:

SELECT * FROM posting ORDER BY date_added DESC LIMIT 1 

SELECT * FROM posting ORDER BY posting_id DESC LIMIT 1 
Смежные вопросы