|
|
|
| Привет!
Кто-нибудь знает, есть ли возможность нумерации результатов запроса в отдельный столбец в mysql?
Например, утверждение "LIMIT" использует для выборки из результатов запроса нумерацию результатов запроса, но как вывести саму эту нумерацию, совершенно непонятно,это скорее уже, очень тонкий момент и не в каждой книге об этом чтото есть.
Есть идеи?
Спасибо! | |
|
|
|
|
|
|
|
для: cosmix
(20.12.2006 в 12:23)
| | Обычно такую нумерацию не воспроизводят в результирующей таблице, а создают средствами обрабатывающей программы или скрипта в цикле.
<?php
...
$i = 0;
while($table = mysql_fetch_array($tbl))
{
$i++;
echo $i." - ".$table['name']."<br>";
}
...
?>
|
Счётчик $i обеспечивает такую нумерацию, вместо 0 его следует инициализировать первым значением конструкции LIMIT (если используется две цифры). | |
|
|
|
|
|
|
|
для: cheops
(20.12.2006 в 12:32)
| | Спасибо, да я понял о чём речь.
Я понимаю что средствами php и похожих программ всё это можно сделать очень легко, но это колоссальная нагрузка на сервер.
Я не верю что средствами mysql это невозможно, подозреваю что запрос недлинный, но хитроумный, а в mysql мне слишком хитрые запросы делать не приходилось, потому слишком глубоко никогда не копал без необходимости, а потому и опыта не так много по вот таким хитростям.
Я видел пример такого запроса в MS SQL, описывался он на одном из форумов в инете. Но спроецировав на mysql - не получилось.
Но без такого запроса не обойтись, например, в случае такой задачи.
Допустим есть mysql-таблица, и в ней под каким то row_id идёт некое значение чего то,неважно чего,какое то значение. При выдаче скриптом на страницу в броузер мы хотим показать страницу, содержащую среди прочих эту позицию(ну то есть соответсвтующую этому row_id, или самого его, для простоты). Но на странице может быть не больше n-позиций.То есть мы разбили результаты постранично...
Разумно было узнать в выдаче mysql запроса нумерацию результатов,и тогда у искомого row_id был бы номер результата по выдаче.
А дальше-дело техники - составляем запрос к конкретно ЭТОМУ интервалу значений в таблице mysql, ГДЕ НАХОДИТСЯ ИСКОМОЕ ЗНАЧЕНИЕ,пользуясь "LIMIT"
Это очень лёгкий по нагрузке способ решить такую задачу.Если всё это делать через php и т.д. это всё тяжело для сервера.
Вот и как же пронумеровать результаты выдачи - неясно пока что :( | |
|
|
|
|
|
|
|
для: cosmix
(20.12.2006 в 13:19)
| | Насчёт нагрузки вы зря: оптимизировать преждевременно и без профилирования современные приложения - это копать яму. Сервер MySQL, как правило, создаёт гораздо большую нагрузку на сервер, чем PHP-скрипты.
Однако решить проблему действительно можно и средствами MySQL, для этого следует определить пользовательскую переменную и увеличивать её значение при выборе каждой последующей записи
SET @start := 0;
SELECT @start := @start + 1 AS id, field1, field2 FROM tbl;
|
| |
|
|
|
|
|
|
|
для: 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 не существует"
Не в курсе в чём может быть дело? | |
|
|
|
|
|
|
|
для: cosmix
(21.12.2006 в 11:49)
| | Об этом можно почитать в одной из наших книг, либо в "Самоучитель MySQL 5", либо в "MySQL 5. В подлиннике". | |
|
|
|
|
|
|
|
для: cosmix
(21.12.2006 в 11:49)
| | Пердставление может представлять лишь один запрос, а у вас их 3 - здесь необходимо воспользоваться хранимой процедурой или функцией.
>Последний запрос "SELECT * FROM a_tab" не выполняется, сообщение об ошибке "таблица
>a_tab не существует"
Как точно выглядит сообщение об ошибке? Текущая база данных выбрана? | |
|
|
|
|
|
|
|
для: 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='' ;
и всё
).
Вот как мне это сделать? Или запрос выше в подзапрос как-то загнать?Теряюсь в догадках от недостатка опыта. Можете помочь? | |
|
|
|
|
|
|
|
для: cosmix
(21.12.2006 в 16:36)
| | У вас версия MySQL какая? Выше 5.0? | |
|
|
|
|
|
|
|
для: 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 даёт ошибку.Попробую выяснить на досуге,и вообще поподробнее изучить этот вопрос. В скаченном учебнике ничего про представления не было, к сожалению.
Интересно, что быстрее: запрос с подзапросом, или запрос с представлением.
Большое спасибо. | |
|
|
|
|
|
|
|
для: cosmix
(21.12.2006 в 20:20)
| | >Client -library version 3.23.52
Клиентская библиотека может быть более старой, чем сам сервер. Выяснить версию MySQL-сервера можно при помощи запроса
>Интересно, что быстрее: запрос с подзапросом, или запрос с представлением.
Передставления появлись только в MySQL 5.0.x, до этой версии их не было в MySQL. | |
|
|
|
|
|
|
|
для: cheops
(21.12.2006 в 22:45)
| | В разделе "Переменные" в Mysql-Front та же информация по версии что и через select version() :
4.1.8-max
Ставил я её давненько уже, конечно теперь понятно почему представления не работают. Установлю пятую версию | |
|
|
|