Это немного больно, но вы можете использовать rownum
select * from
(
select rownum as row_number, base_data.* from
(
select DISTINCT uc.virtual_clip_id, uc.clip_id, uc.duration, uc.title,
uc.thumbnail,uc.filename, uc.description, uc.block_id_start, uc.block_id_end, u.uname,uc.cdate, uc.ctime, uc.privacy_level, uc.user_id FROM user_clips uc, users u, user_like ul
WHERE ul.user_id="+user_id+" and u.user_id=uc.user_id and
uc.virtual_clip_id=ul.virtual_clip_id and ul.like_status='1'
) base_data
ORDER by virtual_clip_id DESC
) sorted
WHERE row_number <= X
Единственная причина, по которой я выбрал дважды, - это выступление группы, и я сохранил порядок за ее пределами, это можно было сделать с помощьюодин подпункт.