Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Выборка номера записи по условию


Автор: ruX 4.6.2009, 11:34
Добрый день

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

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

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-ов глупо, он может быть очень большим

Автор: skyboy 9.6.2009, 11:10
полез в http://dev.mysql.com/doc/refman/5.1/en/user-variables.html.
почитал.
Цитата

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 СУБД "имеет право" выдавать записи каждый раз в другом порядке.

Автор: ruX 10.6.2009, 20:56
Цитата(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

Автор: skyboy 11.6.2009, 13:57
Цитата(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

и будет позицией.

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

Автор: skyboy 12.6.2009, 14:46
дык, "count(*) + 1"
или уже на стороне клиента увеличить на один.
вот только в общем виде для "найти позицию в отсортированном списке" решения так в голову и не приходит.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)