Проблемма с Limit

kolemming

Новичок
Проблемма с Limit

Сразу извеняюсь что запостил столько кода, но уже долго парюсь, специально перенес из проблемного проекта и создал файлик с тестами этих запросов. Итак:
PHP:
//.........................конектимся к базе итд...
//Первый запрос Все даты
$result=mysql_query("select id,order_date from orders limit 0,20 ");
$count_recs=mysql_num_rows($result);
echo "<table border=1><tr><td>id</td><td>Limit Position</td><td>Date</td></tr>";
for($n=0;$n<$count_recs;$n++)
{
	$row=mysql_fetch_array($result);
    echo"<tr><td>".$row['id']."</td><td>".$n."</td><td>".$row['order_date']."</td></tr>";

}

echo '</table>';

//Воторой запрос-две даты минимальная и максимальная лимит первые десять записей
$result=mysql_query("select min(order_date) as min_date, max(order_date) as max_date  from orders limit 0,10");
$row=mysql_fetch_array($result);
echo '-----------------------------------------<br/>';
echo 'Min Date:'.$row['min_date'].'<br/>';
echo 'Max Date:'.$row['max_date'].'<br/>';

//Третий запрос-две даты минимальная и максимальная лимит десять записей с десятой позиции
$result=mysql_query("select min(order_date) as min_date, max(order_date) as max_date  from orders limit 10,10");
$row=mysql_fetch_array($result);
echo '-----------------------------------------<br/>';
echo 'Min Date:'.$row['min_date'].'<br/>';
echo 'Max Date:'.$row['max_date'].'<br/>';
Результат первого запроса:

id Limit Position Date
3 0 2004-10-22
2 1 2004-11-25
5 2 2004-11-26
6 3 2004-11-26
7 4 2004-11-26
8 5 2004-11-26
9 6 2004-11-26
10 7 2004-11-26
12 8 2004-12-01
13 9 2004-12-02
14 10 2004-11-24
15 11 2004-12-02
16 12 2004-12-03
17 13 2004-12-03
21 14 2004-12-07
27 15 2004-12-07
28 16 2004-12-07
29 17 2004-12-07
30 18 2004-12-07
31 19 2004-12-07

Результат второго запроса:
-----------------------------------------
Min Date:2004-10-22
Max Date:2004-12-21

Результат третьего запроса:

-----------------------------------------
Min Date:
Max Date:


В общем я уже не знаю в чем причина или переработал сеня
:( Help...

Ошибся мальца в третьем запросе все еще проверял разные варианты перед тем как постить...уже исправленно и еще раз ошибся и исправил!
 

Wicked

Новичок
может это потому, что при [sql]select min(..), max(..)[/sql] возвращается только одна запись и лимит натравливается только после этого? :)
 

Сергей123

Новичок
Думаю, что
Минимальное (максимальное) может быть только одно. Твой второй запрос вариант 1 возвращает 1 запись. Поэтому LIMIt там и второй запрос вариант 2 бессмысленны.
 

kolemming

Новичок
Сорри за то что ошибся форумом, перенесут наверное.

Все токо сейчас воткнул, что он мне вернул минимальную и максимальную даты по всей таблице!

Ну в целом то как мне быть?

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

Wicked

Новичок
ну значит надо лимит сделать до того, как будет авто-группировка от использования min(), max(). Это можно сделать, например, подзапросом:
[sql]select min(..), max(..) from (select * from ... limit n, m)[/sql]
либо с использованием временной таблицы:
[sql]create temporary table TEMP select from * from ... limit n, m;
select min(..), max(..) from TEMP;
drop temporary table TEMP[/sql]
 

kolemming

Новичок
Originally posted by Фанат
а почему выборка никак не сортируется?
Это тестовый пример, реальный сортируется и много чего еще происходит там, но я уперся в это проблемму и начал с простого, правда зря переносил в пхп, хотя... переносил то, потому что не смног скопировать из терминала результаты, плюс решил заодно самопроверку сделать и еще раз все переписать, но не в теле проекта а в отдельном файле. Воть...

Wicked

А можно по подробнее на счет вложенных запросов, я что-то не уловил смысл?

По поводу временной таблицы тож не понял, но это наверное лишнее, у меня и так 14 запросов сейчас срабативает, кратно кол-ву страниц(хотя вариант все равно как оказалось не рабочий), а это еще не весь объем данных который будет, а только месяц работы...
 

kolemming

Новичок
Wicked

Спасибо! Попробую.

И еще может сама затея не та, все таки 14 запросов(просто страниц пока всего 14 и при том, что по 10 доков на страницу вывод стоит).

Если будут другие варианты, с удовольствием выслушаю, ведь если страниц станет больше, например 100, то и запросов будет столько же, не считая остальных которые логику обслуживают. Примерно двацать пользователей на 400 пне под win2K будут все это мучать...
 

Фанат

oncle terrible
Команда форума
Это тестовый пример
Ты хоть понимаешь, что диапазон может быть ТОЛЬКО если выборка сортируется?

страниц станет больше, например 100, то и запросов будет столько же,
ты с дуба рухнул?
у тебя твои пользователи будут заниматься только тем, что просматривать твои сто страниц по очережи и потом все с начала? Не отрываясь?
 

Wicked

Новичок
100 страниц по 10 записей - это не то, на чем валятся сервера (или "серверы"?) :)
 

kolemming

Новичок
Придеться обновлять Сервер БД, вложенные запросы пашут токо на 4.1 и выше.
 

Фанат

oncle terrible
Команда форума
kolemming
скажи, выбрать твои 20 несчастных записей в массив, посчитать максимальное и минимальное значения и потом вывести - это такая непосильная для тебя задача, что только выделенный сервер муэскуэль с этим справится?
Может, тебе еще суперкомпьютер НАСА для этого понадобится?
 

kolemming

Новичок
Originally posted by Wicked
А чем тем тебя второй вариант не устраивает?
Спасибо за советы!

Сделал вторым вариантом, но возможно криво, потому что теперь список из 14 страниц и 10 строк на страницы выводят ~200 запросов(в зависимости от условий вывода).

Как сделал.

В функции вернуть диапазон есть:

1. Запрос на создание таблицы.
2. Запрос на выборку диапазона.
3. Запрос на запись туда.
4. Запрос мин макс.
5. Запрос на удаление.

Что-то мне кажеться это не совсем верно, но работает и то, что нужно. Наверное когда подольше и побольше почитаю доки к mySql то оптимизирую.



Фанат
Эксперименты с новой БД приостановленны, по причине убитых ссылок и дистрибов. Твой вариант мне пришел вголову после двух часов смотрения на код первого поста, но я решил что полезнее будет не оттачивать скорость печати на "qwerty", а узнать побольше о БД или я не прав в своем мышлении?

Видишь ли, ситуация с этим скриптом такова, что мне его делать и делать, до того светлого момента, как я возму и перепишу все заново, не желая копаться в том, чего я наворотил по желанию юзеров, но уже основываясь на пройденном!
 

kolemming

Новичок
Ты шутишь?
ОДНУ страницу выводят не два примитивных запроса, а двести?
Нет не шучу, но самому смешно стало, да и php поднапрягся:

0.429 seconds- со всеми манипуляциями.

0.175 seconds- без функции возврата диапазона.

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

Фанат

oncle terrible
Команда форума
скажи, а с перебором массива у тебя сколько запросов будет?
или ты под перебором имеешь в виду запрос ВСЕЙ таблицы?

И ответь на вопрос - что у тебя в строке нафигации.
А то жа наш добрый, но недалёкий Wicked так и будет шуровать по шпалам не в ту сторону.
 
Сверху