DECLARE tag_row RECORD; one_tag RECORD; blog_row RECORD; BEGIN CREATE TEMPORARY TABLE tags AS SELECT DISTINCT (LOWER (_freetag_blog.tag)) AS tag, COUNT (tag) FROM _freetag_blog JOIN _freetagged_object_blog ON (_freetag_blog.id = _freetagged_object_blog.tag_id) WHERE _freetagged_object_blog.object_tree <@ site_path AND (_freetag_blog.rating & (1 << (1 - 1))) = 0 AND (_freetagged_object_blog.rating & (1 << (1 - 1))) = 0 GROUP BY tag ORDER BY 2 DESC OFFSET 0 LIMIT nb_tags_max; -- requete de selection des tags FOR tag_row IN SELECT tag FROM tags ORDER BY RANDOM () OFFSET 0 LIMIT 10 LOOP SELECT id, raw_tag INTO one_tag FROM _freetag_blog JOIN _freetagged_object_blog ON (_freetag_blog.id = _freetagged_object_blog.tag_id) WHERE _freetag_blog.tag = tag_row.tag GROUP BY _freetag_blog.id, _freetag_blog.raw_tag ORDER BY COUNT (_freetagged_object_blog.tag_id) DESC LIMIT 1; FOR blog_row IN SELECT _blog.id, _blog.parent_id, _blog.path, _blog.data, _blog.date_creation, _blog.date_publishing, _blog.date_modification, _blog.reference, _blog.name, _blog.main_host, _blog.base_host, _blog.description, _blog.rating, tag_row.tag::varchar, one_tag.raw_tag, (COALESCE (rank, 0))::smallint FROM _blog JOIN _freetagged_object_blog ON (_blog.path = _freetagged_object_blog.object_tree) LEFT JOIN _top_blog ON (_blog.id = _top_blog.id ) WHERE _blog.path <@ site_path AND _freetagged_object_blog.tag_id = one_tag.id AND (_blog.rating & (1 << (1 - 1))) = 0 AND COALESCE (rank, 0) > min_blog_rank GROUP BY _blog.id, _blog.parent_id, _blog.path, _blog.data, _blog.date_creation, _blog.date_publishing, _blog.date_modification, _blog.reference, _blog.name, _blog.main_host, _blog.base_host, _blog.description, _blog.rating, rank ORDER BY RANDOM () * COALESCE (rank, 0) DESC OFFSET 0 LIMIT blogs_per_tag LOOP RETURN NEXT blog_row; END LOOP; END LOOP; END;