Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Как выбрать последнее


Автор: Alex0202 28.5.2005, 07:51
Таблица:
Код

CREATE TABLE `members` (
  `oid`  integer(18) default NULL,
  `id` varchar(15) default NULL,
  `age` integer(2) default NULL,
  `country` varchar(35) default NULL,
  `state` varchar(3) default NULL,
  `city` varchar(50) default NULL,
  `sex`  varchar(8) default NULL,
  `lsex`  varchar(8) default NULL,
  `pwd`  varchar(15) default NULL,    
  `email`  varchar(35) default NULL
) TYPE=MyISAM;


Как мне выделить(отсортеравать) все начиная с последней добавленой запись ?

Автор: Black 28.5.2005, 09:10
Цитата
Как мне выделить(отсортеравать) все начиная с последней добавленой запись ?


Если я правильно понял что вам надо тогда так:

Код

SELECT * FROM members ORDER BY id desc; 


Автор: Irokez 28.5.2005, 11:50
Цитата(PHP @ 28.5.2005, 09:10)
SELECT * FROM members ORDER BY id desc;

тогда надо объявить ID как счетчик (auto_increment) или ввести дополнительное поле типа timestamp

Автор: Black 28.5.2005, 14:41
Irokez
ну я думаю Alex0202 занося ID делает ID++ smile

Если же ID будут иметь одинаковые значения нарушится условие
Цитата
начиная с последней добавленой записи

Автор: sergejzr 28.5.2005, 14:49
Вообще разве они не автоматом выйдут начиная с последней, если просто сделать
Код

SELECT * FROM ...

Насколько я знаю во многих БД это именно так. Без доп. условий записи складываются по мере их добавления и выдаются в обратном порядке.
(Насчёт стандарта, не знаю... Вряд ли это так..)


Добавлено @ 14:49
Это конечно если tiestamp'a нет.

Автор: Irokez 28.5.2005, 14:52
Цитата(sergej @ 28.5.2005, 14:49)
Вообще разве они не автоматом выйдут начиная с последней, если просто сделать

наоборот, начиная с первой, идут

Автор: sergejzr 28.5.2005, 14:57

Тогда если нет timestamp, можно извратиться создав темп - таблицу и скопировав в неё данные + timestamp.
И выдавать наоборот smile


Автор: Mal Hack 28.5.2005, 20:04
Цитата(Irokez @ 28.5.2005, 15:52)
наоборот, начиная с первой, идут


Цитата(sergej @ 28.5.2005, 15:49)
Вообще разве они не автоматом выйдут начиная с последней, если просто сделать


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

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

Автор: Гость_Alex0202 28.5.2005, 20:33
id это имя пользователя vasya , petya ...
Я знаю что можно использовать timestamp но нехотелось бы иметь лишних полей так как база будет 500,000+ записей

Автор: Irokez 28.5.2005, 20:49
Цитата(Mal @ 28.5.2005, 20:04)
Если никакая сортировка не указана, то база выдаст записи, отсортированные по времени последнего добавления, т.е. так, в каком порядке они лежат в памяти. Первый зашел, последний вышел.

может все таки наоборот? первая запись будет первой и в выборке

Цитата
id это имя пользователя vasya , petya ...
Я знаю что можно использовать timestamp но нехотелось бы иметь лишних полей так как база будет 500,000+ записей

по-моему все таки лучше ввести еще одно поле - дата регистрации, потому что насколько мне известно иначе получить искомую выборку в MySQL (MyISAM) невозможно

Автор: Mal Hack 28.5.2005, 20:53
Цитата(Irokez @ 28.5.2005, 21:49)
может все таки наоборот? первая запись будет первой и в выборке

Может я опять туплю... То, что последним добавил первым выйдет в выборке. В любом случае зависит от того, как в данный конкретный момент в памяти таблица лежит.

Автор: Guest 28.5.2005, 21:44
Цитата
id это имя пользователя vasya , petya ...
Я знаю что можно использовать timestamp но нехотелось бы иметь лишних полей так как база будет 500,000+ записей


Млин, а первичный ключ у тебя что? Хотяб во избежание дубликации строк следует ввести автоинкрементное поле. А также если в таблице не будет целочисленного id, как же будет производиться соединение?
Точнее, что потом даст EXPLAIN ?

Автор: Гость_Ignat 28.5.2005, 21:45
Это был Ignat smile

Автор: Alex0202 28.5.2005, 22:34
to Guest :
oid = mt_rand(999,999999);

Автор: Гость_Alex0202 29.5.2005, 18:38
А может можно сделать например

Код

$res=mysql_query("SELECT * FROM `members`");


а потом перевернуть результат

Код

$res=reverse($res);

только как ??

array_reverse совсем не то ..

а идеально было бы есьи можно можно так:

Код

$res=mysql_query("SELECT * FROM `members` DESC");

smile

Автор: Irokez 29.5.2005, 20:57
Цитата
только как ??

Код

$res=mysql_query("SELECT * FROM `members`");
$members = array();
while ($data = mysql_fetch_assoc($res)) {
    array_push($members, $data);
}
$members = array_reverse($members);

Автор: DENNN 30.5.2005, 08:30
Цитата(sergej @ 28.5.2005, 14:49)
Насколько я знаю во многих БД это именно так. Без доп. условий записи складываются по мере их добавления и выдаются в обратном порядке.

Могут выдаваться, а могут и нет. В любом случае это не постоянно, т.к. противоречит принципам доступа к информации в БД.

Автор: Ignat 30.5.2005, 10:19
Цитата(Alex0202 @ 28.5.2005, 23:34)
oid = mt_rand(999,999999);

ИМХО, маразм. А почему бы "нормальный" ID не ввести в базу?

Автор: Bikutoru 30.5.2005, 18:17
Цитата
Если никакая сортировка не указана, то база выдаст записи, отсортированные по времени последнего добавления


Это не совсем верно. Точнее это верно до тех пор, пока ты не удалишь хотя бы одну запись. Данные в БД хранятся с разбиением по т.н. страницам, если ты удаляешь записи, то остальные не смещаются, а остаются на своих местах. А когда ты добавляешь запись, то она добавляется после последней записи или в какие-то свободные области имеющихся страниц. А вывод без сортировки происходит как раз по страницам, т.е. так как записи хранятся на диске...

Автор: Гость_Alex0202 31.5.2005, 06:27
Цитата(Ignat @ 30.5.2005, 10:19)
Цитата(Alex0202 @ 28.5.2005, 23:34)
oid = mt_rand(999,999999);

ИМХО, маразм. А почему бы "нормальный" ID не ввести в базу?

Ну а как подругому ?
помимо таблицы `members` в которой определены oid(mt_rand()) и id(vasya) ... и другие поля,
есть ещё 7 таблиц в которых я орентируюсь по oid.

Автор: Гость_Alex0202 31.5.2005, 06:29
Цитата(DENNN @ 30.5.2005, 08:30)
Цитата(sergej @ 28.5.2005, 14:49)
Насколько я знаю во многих БД это именно так. Без доп. условий записи складываются по мере их добавления и выдаются в обратном порядке.

Могут выдаваться, а могут и нет. В любом случае это не постоянно, т.к. противоречит принципам доступа к информации в БД.

Согласен , в базе нет порядка .

Автор: Гость_Alex0202 31.5.2005, 06:36
Цитата(Irokez @ 29.5.2005, 20:57)
Цитата
только как ??

Код

$res=mysql_query("SELECT * FROM `members`");
$members = array();
while ($data = mysql_fetch_assoc($res)) {
    array_push($members, $data);
}
$members = array_reverse($members);

Да.. это будет работать , но буду использовать это только в совсем крайний случай

Автор: lika 1.6.2005, 12:26
Можно поступить очень просто:
добавить поле даты создания, например createdate datetime
Во время insert сажать в него sysdate()
Во время выборки
SELECT * FROM members ORDER BY createdate desc;

Тогда будет гарантия, что первой появится именно последняя добавленная запись

Лика

Автор: Гость_Alex0202 2.6.2005, 00:17
Цитата(lika @ 1.6.2005, 12:26)
Можно поступить очень просто:
добавить поле даты создания, например createdate datetime
Во время insert сажать в него sysdate()
Во время выборки
SELECT * FROM members ORDER BY createdate desc;

Тогда будет гарантия, что первой появится именно последняя добавленная запись

Лика

Возможно вы прочитали ни всё
Условие было : Сделать это недобавляя полей.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)