Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Вопрос: нумерация результатов запроса отдельным столбцом
 
 автор: cosmix   (20.12.2006 в 12:23)   письмо автору
 
 

Привет!

Кто-нибудь знает, есть ли возможность нумерации результатов запроса в отдельный столбец в mysql?
Например, утверждение "LIMIT" использует для выборки из результатов запроса нумерацию результатов запроса, но как вывести саму эту нумерацию, совершенно непонятно,это скорее уже, очень тонкий момент и не в каждой книге об этом чтото есть.

Есть идеи?

Спасибо!

   
 
 автор: cheops   (20.12.2006 в 12:32)   письмо автору
 
   для: cosmix   (20.12.2006 в 12:23)
 

Обычно такую нумерацию не воспроизводят в результирующей таблице, а создают средствами обрабатывающей программы или скрипта в цикле.
<?php
  
...
  
$i 0;
  while(
$table mysql_fetch_array($tbl))
  {
     
$i++;
      echo 
$i." - ".$table['name']."<br>";
  }
  ...
?>

Счётчик $i обеспечивает такую нумерацию, вместо 0 его следует инициализировать первым значением конструкции LIMIT (если используется две цифры).

   
 
 автор: cosmix   (20.12.2006 в 13:19)   письмо автору
 
   для: cheops   (20.12.2006 в 12:32)
 

Спасибо, да я понял о чём речь.

Я понимаю что средствами php и похожих программ всё это можно сделать очень легко, но это колоссальная нагрузка на сервер.

Я не верю что средствами mysql это невозможно, подозреваю что запрос недлинный, но хитроумный, а в mysql мне слишком хитрые запросы делать не приходилось, потому слишком глубоко никогда не копал без необходимости, а потому и опыта не так много по вот таким хитростям.

Я видел пример такого запроса в MS SQL, описывался он на одном из форумов в инете. Но спроецировав на mysql - не получилось.

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

Допустим есть mysql-таблица, и в ней под каким то row_id идёт некое значение чего то,неважно чего,какое то значение. При выдаче скриптом на страницу в броузер мы хотим показать страницу, содержащую среди прочих эту позицию(ну то есть соответсвтующую этому row_id, или самого его, для простоты). Но на странице может быть не больше n-позиций.То есть мы разбили результаты постранично...
Разумно было узнать в выдаче mysql запроса нумерацию результатов,и тогда у искомого row_id был бы номер результата по выдаче.
А дальше-дело техники - составляем запрос к конкретно ЭТОМУ интервалу значений в таблице mysql, ГДЕ НАХОДИТСЯ ИСКОМОЕ ЗНАЧЕНИЕ,пользуясь "LIMIT"

Это очень лёгкий по нагрузке способ решить такую задачу.Если всё это делать через php и т.д. это всё тяжело для сервера.
Вот и как же пронумеровать результаты выдачи - неясно пока что :(

   
 
 автор: cheops   (20.12.2006 в 15:04)   письмо автору
 
   для: cosmix   (20.12.2006 в 13:19)
 

Насчёт нагрузки вы зря: оптимизировать преждевременно и без профилирования современные приложения - это копать яму. Сервер MySQL, как правило, создаёт гораздо большую нагрузку на сервер, чем PHP-скрипты.
Однако решить проблему действительно можно и средствами MySQL, для этого следует определить пользовательскую переменную и увеличивать её значение при выборе каждой последующей записи
SET @start := 0;
SELECT @start := @start + 1 AS id, field1, field2 FROM tbl;

   
 
 автор: cosmix   (21.12.2006 в 11:49)   письмо автору
 
   для: cheops   (20.12.2006 в 15:04)
 

Да, спасибо, вот нашёл также что в mysql-front надо эскейпить двоеточия в этой окнструкции.

А где можно почитать про воттакие запросы с присваиванием переменной значения и т.д., с примерами?

===

И вот почему то после созданного представления, последний запрос не выполняется:

CREATE VIEW a_tab
AS

SET @n ::= 0;
SELECT @n ::= @n+1 AS rownum, c_title FROM catalog;

SELECT * FROM a_tab


Последний запрос "SELECT * FROM a_tab" не выполняется, сообщение об ошибке "таблица a_tab не существует"
Не в курсе в чём может быть дело?

   
 
 автор: cheops   (21.12.2006 в 12:45)   письмо автору
 
   для: cosmix   (21.12.2006 в 11:49)
 

Об этом можно почитать в одной из наших книг, либо в "Самоучитель MySQL 5", либо в "MySQL 5. В подлиннике".

   
 
 автор: cheops   (21.12.2006 в 12:47)   письмо автору
 
   для: cosmix   (21.12.2006 в 11:49)
 

Пердставление может представлять лишь один запрос, а у вас их 3 - здесь необходимо воспользоваться хранимой процедурой или функцией.

>Последний запрос "SELECT * FROM a_tab" не выполняется, сообщение об ошибке "таблица
>a_tab не существует"
Как точно выглядит сообщение об ошибке? Текущая база данных выбрана?

   
 
 автор: cosmix   (21.12.2006 в 16:36)   письмо автору
 
   для: cheops   (21.12.2006 в 12:47)
 

"MySQL поддерживает пользовательские переменные, начиная с версии 3.23.6."
Теперь ясненько, это новьё.

Запрос делается в mysql front древней версии (мне нравится её интерфейс безумно).

ВОт лог front'a

SET @n ::= 0

CREATE view a_tab AS SELECT @n ::= @n+1 AS rownum, c_title FROM catalog
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'view a_tab AS SELECT @n := @n+1 AS rownum, c_title FROM catalog'

SELECT * FROM a_tab where c_id = 2
Table 'excell.a_tab' doesn't exist

===================================
Не прокатывает создание представления.
Отвечая на Ваш вопрос, да, конечно, он видит текущую базу,именуемую excell.

Вот что я хотел бы:

Создать представление,созданное тем самым запросом:

SET @n ::= 0
SELECT @n ::= @n+1 AS rownum, c_title FROM catalog

То есть получив таблицу-результат от этого запроса, загнать её в представление. Или во что то другое, какую то временную таблицу, но к которой можно было обращаться потом
(
последующий запрос к этой временной таблице предполагается всего 1, а именно такой :
select * from $$временая таблица или представление$$ where c_id='' ;
и всё
).

Вот как мне это сделать? Или запрос выше в подзапрос как-то загнать?Теряюсь в догадках от недостатка опыта. Можете помочь?

   
 
 автор: cheops   (21.12.2006 в 19:47)   письмо автору
 
   для: cosmix   (21.12.2006 в 16:36)
 

У вас версия MySQL какая? Выше 5.0?

   
 
 автор: cosmix   (21.12.2006 в 20:20)   письмо автору
 
   для: cheops   (21.12.2006 в 19:47)
 

Client -library version 3.23.52

Скачал учебничек по mysql 5 и почитал про переменные.
У меня пришла в голову мысль воспользоваться подзапросом для альтернативного решения проблемы, потому что слышал о них и даже года 2 назад использовал немного, и почитал про подзапросы.
И вот такой запрос с подзапросом делает тоже самое - альтернативный запрос запросу с create view :

SET @n ::= 0 ;

select * from (SELECT @n ::= @n+1 AS rownum, c_title, c_id FROM catalog)as t1 where c_id=3

тройка тут значения не имеет конечно, скрипт будет принимать разные значения c_id...

Всё прокатило, но я всё же хотел бы понять почему create view даёт ошибку.Попробую выяснить на досуге,и вообще поподробнее изучить этот вопрос. В скаченном учебнике ничего про представления не было, к сожалению.
Интересно, что быстрее: запрос с подзапросом, или запрос с представлением.

Большое спасибо.

   
 
 автор: cheops   (21.12.2006 в 22:45)   письмо автору
 
   для: cosmix   (21.12.2006 в 20:20)
 

>Client -library version 3.23.52
Клиентская библиотека может быть более старой, чем сам сервер. Выяснить версию MySQL-сервера можно при помощи запроса
SELECT VERSION()


>Интересно, что быстрее: запрос с подзапросом, или запрос с представлением.
Передставления появлись только в MySQL 5.0.x, до этой версии их не было в MySQL.

   
 
 автор: cosmix   (22.12.2006 в 11:45)   письмо автору
 
   для: cheops   (21.12.2006 в 22:45)
 

В разделе "Переменные" в Mysql-Front та же информация по версии что и через select version() :

4.1.8-max

Ставил я её давненько уже, конечно теперь понятно почему представления не работают. Установлю пятую версию

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования