Вывод первого и последнего значения

avgaz

Участник
Регистрация
18 Окт 2006
Сообщения
189
Реакции
7
Собственно вопрос в следующем как составить запрос что бы вывести из БД первое и последнее сообщение.
 
  • Заблокирован
  • #2
Одним запросом кажется ни как...
Придется в 2 делать.

("SELECT * FROM `blabla` ORDER BY `date` DESC LIMIT 1"); // вывод последнего значения по дате

и вывод первого
$date1 = "1";
mysql_fetch_array(mysql_query("SELECT * FROM `blabla` WHERE date = $date1")); // вывод первого значения где дата = 1
 
Код:
SELECT * FROM   table1 AS t
WHERE
  t.id = (SELECT max(x.id)  FROM table1 AS x) OR t.id = (SELECT min(x.id) FROM   table1 AS x)
 
Код:
(SELECT * FROM messages ORDER BY date ASC LIMIT 1)
UNION
(SELECT * FROM messages ORDER BY date DESC LIMIT 1)
 
  • Заблокирован
  • #5
Если ваша таблица содержит мало записей то ORDER BY и LIMIT вполне подойдут. Если много, то советую избавиться от ORDER BY и LIMIT для увеличения скорости. И это правильно т.к. будет в полном соответствии с теорией множеств, в которой where есть, а вот limit - нету. Сделайте как Для просмотра ссылки Войди или Зарегистрируйся или если есть id то последний получите через SELECT COUNT(*) FROM ''.
 
Спасибо. Теперь вопрос что быстрее будет работать два отдельных запроса SELECT или через UNION ?
 
  • Заблокирован
  • #7
С UNION будет быстрее
 
скорость выполнения запросов в mysql удобно смотреть через profiles, например выполнив такой запрос:
Код:
set profiling=1;
select * from wp_posts order by ID ASC limit 1
;
select * from wp_posts order by ID DESC limit 1
;
(select * from wp_posts order by ID ASC limit 1)
UNION
(select * from wp_posts order by ID DESC limit 1)
;
SELECT * FROM wp_posts AS t
WHERE
t.id = (SELECT  MAX(x.ID)  FROM wp_posts AS x) OR t.ID = (SELECT SQL_NO_CACHE MIN(x.ID) FROM wp_posts AS x)
;

а дальше смотреть таблицу скорости по запросу:
Код:
show profiles;

для 100000 записей получилось такое:

Код:
0.00029525 select ...
0.00014650 select ...
0.00427675 (select ...
0.00035400 select ...

выходит два запроса первый и второй в сумме почти тоже самое что последний запрос, который от chang с min, max
А третий запрос с union медленнее в разы.
Дальше протестировал в php каждый запрос:
PHP:
$t = microtime(true);
$sql = mysql_query("
        select * from wp_posts order by ID ASC limit 1
        ");
while($row = mysql_fetch_array($sql)){
    print_r($row);
}
echo microtime(true)-$t;

получилось:
Код:
0.000426054000854
0.000274181365967
0.00274300575256
0.00112295150757

Тут уже по другому последний запрос с max min в два раза но быстрее чем третий с union.
А простые первый и второй запросы по отдельности или вместе всё равно быстрее чем с union или max min.
Выходит для скорости лучше использовать запросы по отдельности.
 
Назад
Сверху