Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выборка номера записи по условию, наиболее оптимально 
V
    Опции темы
ruX
Дата 4.6.2009, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 8.9.2006
Где: г.Гатчина

Репутация: нет
Всего: 3



Добрый день

Мне нужно найти номер записи по данному условию в выборке.

Такой запрос 
Код

SELECT photo.photoid , (@nn := @nn +1) AS nn
FROM `photo` AS photo, (SELECT @nn :=0) AS temp
WHERE `galtype` = 'somewhere' AND galid='17'

даёт список пару photoid, nn

Но мне нужно найти позицию в выборке(nn) для определённого photoid

Хотел воспользоваться HAVING photo.photoid=123456, 
Код

SELECT photo.photoid , (@nn := @nn +1) AS nn
FROM `photo` AS photo, (SELECT @nn :=0) AS temp
WHERE `galtype` = 'somewhere' AND galid='17'
HAVING photo.photoid=123456

но тогда почему-то nn всегда 1

Не понимаю почему. HAVING ведь выбирает уже из выбранных данных и не должен влиять на nn
(по http://dev.mysql.com/doc/refman/5.1/en/select.html )
Цитата

The HAVING clause is applied nearly last, just before items are sent to the client, with no optimization. (LIMIT is applied after HAVING.) 


Как выкрутиться?
Получать весь список id-ов глупо, он может быть очень большим
--------------------
Случайность - внезапно наступившая неизбежность.
PM MAIL WWW ICQ   Вверх
skyboy
Дата 9.6.2009, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



полез в ман.
почитал.
Цитата

In a SELECT statement, each expression is evaluated only when sent to the client. This means that in a HAVING, GROUP BY, or ORDER BY clause, you cannot refer to an expression that involves variables that are set in the SELECT list. For example, the following statement does not work as expected: 
mysql> SELECT (@aa:=id) AS a, (@aa+3) AS b FROM tbl_name HAVING b=5;

и даже больше:
Цитата

The general rule is never to assign a value to a user variable in one part of a statement and use the same variable in some other part of the same statement. You might get the results you expect, but this is not guaranteed. 

Круто, правда? Похоже, не получится у тебя с переменными в запросе решить задачу.
Чесно говоря, я не понял, двух вещей:
- почему не использовать LIMIT 123456,1?
- где твой порядок следования, заданный через ORDER BY? в отсутствие ORDER BY СУБД "имеет право" выдавать записи каждый раз в другом порядке.
PM MAIL   Вверх
ruX
Дата 10.6.2009, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 8.9.2006
Где: г.Гатчина

Репутация: нет
Всего: 3



Цитата(skyboy @  9.6.2009,  11:10 Найти цитируемый пост)
Круто, правда? Похоже, не получится у тебя с переменными в запросе решить задачу.

очень круто.
Цитата из мана в тему, спасибо.

Цитата(skyboy @  9.6.2009,  11:10 Найти цитируемый пост)
- почему не использовать LIMIT 123456,1?

Потому что мне нужно вытянуть номер позиции по ключу, а не ключ в позиции.


Цитата(skyboy @  9.6.2009,  11:10 Найти цитируемый пост)
- где твой порядок следования, заданный через ORDER BY? в отсутствие ORDER BY СУБД "имеет право" выдавать записи каждый раз в другом порядке.

Ок, будем считать что указан, ORDER BY photo.photoid

--------------------
Случайность - внезапно наступившая неизбежность.
PM MAIL WWW ICQ   Вверх
skyboy
Дата 11.6.2009, 13:57 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(ruX @  10.6.2009,  19:56 Найти цитируемый пост)
Потому что мне нужно вытянуть номер позиции по ключу, а не ключ в позиции.

да, неверно понял :(

Добавлено через 2 минуты и 41 секунду
Цитата(ruX @  10.6.2009,  19:56 Найти цитируемый пост)
ORDER BY photo.photoid

в таком случае
Код

SELECT count(*)
FROM `photo` AS photo
WHERE `galtype` = 'somewhere' AND galid='17' AND photo.photoid< 123456

и будет позицией.
PM MAIL   Вверх
ruX
Дата 11.6.2009, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 8.9.2006
Где: г.Гатчина

Репутация: нет
Всего: 3



skyboy, спасибо! то что надо, интересный ход.  smile  Правда отсчёт в этом случае с нуля

--------------------
Случайность - внезапно наступившая неизбежность.
PM MAIL WWW ICQ   Вверх
skyboy
Дата 12.6.2009, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



дык, "count(*) + 1"
или уже на стороне клиента увеличить на один.
вот только в общем виде для "найти позицию в отсортированном списке" решения так в голову и не приходит.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1053 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.