def tags_count(options = {})
options = {:order => 'count DESC'}.merge(options)
o, o_pk, o_fk, t, tn, t_pk, t_fk, jt = set_locals_for_sql
sql = "SELECT #{t}.#{t_pk} AS id, #{t}.#{tn} AS name, COUNT(*) AS count FROM #{jt}, #{o}, #{t} WHERE #{jt}.#{t_fk} = #{t}.#{t_pk}
AND #{jt}.#{o_fk} = #{o}.#{o_pk}"
sql << " AND #{sanitize_sql(options[:conditions])}" if options[:conditions]
sql << " GROUP BY #{t}.#{t_pk},#{t}.#{tn}"
sql << " HAVING count #{options[:count]} " if options[:count]
sql << " ORDER BY #{options[:order]} " if options[:order]
add_limit!(sql, options)
result = connection.select_all(sql)
if !options[:raw]
count = result.inject({}) { |hsh, row| hsh[row["#{tn}"]] = row['count'].to_i; hsh }
if options[:sort_list] && options[:sort_list].is_a?(Proc)
count = options[:sort_list].call(count.keys.collect{|key| [key,count[key]]})
end
end
count || result
end