def tags_count(options = {})
options = {:order => 'count DESC'}.merge(options)
o, o_pk, o_fk, t, t_pk, t_fk, jt = set_locals_for_sql
sql = "SELECT #{t}.#{t_pk} AS id, #{t}.name 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}.name"
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)
count = result.inject({}) { |hsh, row| hsh[row['name']] = row['count'].to_i; hsh } unless options[:raw]
count || result
end