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

Тема в разделе "Базы данных", создана пользователем avgaz, 30 янв 2012.

Модераторы: latteo
  1. avgaz

    avgaz

    Регистр.:
    18 окт 2006
    Сообщения:
    188
    Симпатии:
    6
    Собственно вопрос в следующем как составить запрос что бы вывести из БД первое и последнее сообщение.
     
  2. Дмитрий Кесаев

    Дмитрий Кесаев aka Zlobniy Babko

    Заблокирован
    Регистр.:
    10 май 2007
    Сообщения:
    1.332
    Симпатии:
    1.265
    Одним запросом кажется ни как...
    Придется в 2 делать.

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

    и вывод первого
    $date1 = "1";
    mysql_fetch_array(mysql_query("SELECT * FROM `blabla` WHERE date = $date1")); // вывод первого значения где дата = 1
     
  3. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    364
    Симпатии:
    117
    Код:
     
    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)
     
     
     
    
     
  4. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    Код:
    (SELECT * FROM messages ORDER BY date ASC LIMIT 1)
    UNION
    (SELECT * FROM messages ORDER BY date DESC LIMIT 1)
     
  5. ywitodenasuby

    ywitodenasuby Постоялец

    Заблокирован
    Регистр.:
    31 янв 2012
    Сообщения:
    65
    Симпатии:
    21
    Если ваша таблица содержит мало записей то ORDER BY и LIMIT вполне подойдут. Если много, то советую избавиться от ORDER BY и LIMIT для увеличения скорости. И это правильно т.к. будет в полном соответствии с теорией множеств, в которой where есть, а вот limit - нету. Сделайте как chang или если есть id то последний получите через SELECT COUNT(*) FROM ''.
     
  6. avgaz

    avgaz

    Регистр.:
    18 окт 2006
    Сообщения:
    188
    Симпатии:
    6
    Спасибо. Теперь вопрос что быстрее будет работать два отдельных запроса SELECT или через UNION ?
     
  7. ywitodenasuby

    ywitodenasuby Постоялец

    Заблокирован
    Регистр.:
    31 янв 2012
    Сообщения:
    65
    Симпатии:
    21
    С UNION будет быстрее
     
  8. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    скорость выполнения запросов в 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.
    Выходит для скорости лучше использовать запросы по отдельности.
     
    HEPB и avgaz нравится это.