LINUX.ORG.RU

[туплю, торможу] MySQL correlated subqueries


0

0

День добрый. Несколько лет не работал с базами, теперь страшно туплю^W^W испытываю некоторые трудности с решением такой вот задачи. Имеется таблица следующего типа:

---------
| U | V |
---------
| x | a |
| x | b |
| x | c |
| y | i |
| y | j |
| y | h |
| y | g |
| z | s |
| z | t |
---------
Нужно написать запрос, который на выходе выдавал бы следующее:
-------------
| U | V | W |
-------------
| x | a | 1 |
| x | b | 2 |
| x | c | 3 |
| y | i | 1 |
| y | j | 2 |
| y | h | 3 |
| y | g | 4 |
| z | s | 1 |
| z | t | 2 |
-------------

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

SELECT outer.U, outer.V, 
(
	SELECT @a:=@a+1 rownum
	FROM
		(SELECT @a:=0) tmp, 
		(SELECT * 
		 FROM `table` double_nested 
		 WHERE double_nested.U = outer.U) nested // error
	WHERE nested.V = outer.V
) as W,
FROM `table` outer

На что MySQL выдаёт: «#1054 - Unknown column 'outer.U' in 'where clause'». Почитав документацию, нашёл там такие строки (отсюда http://dev.mysql.com/doc/refman/5.0/en/unnamed-views.html):

Subqueries in the FROM clause cannot be correlated subqueries, unless used within the ON clause of a JOIN operation.

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

★★★★

Может и можно, но не нужно, т.к. это противоречит реляционной модели (hint: в ней нет такого понятия, как номер строки). Так что сортируй на стороне сервера, нумеруй на клиенте.

AEP ★★★★★
()

W(u,v)=count(SELECT outer.V WHERE outer.U=u AND outer.V<=v);

дальше субзапросом или джонить

поправишь сам синтаксис и на случай если среди v могут быть повторения.

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

Спасибо, то что нужно; так и знал что всё окажется очень просто :)

runtime ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.