На сайте для возможности писать отзывы пользователей на друг друга использую Content Profile и Fivestar Extra. Пользователи пишут комментарий к ноде-профилю и ставят оценку с помощью fivestar.
Начал писать во views выборку пользователей (имя, uid, дата создания и т.д.), захотел отображать так же и среднюю оценку. Создаю связь "Материал: Content Profile", а так же "Материал: Vote results", которая использует первую. Добавляю поле "Vote results: Значение", и... там на каждого пользователя по несколько значений, а у пользователей одинаковые значения. Стал разбираться.
Сам SQL-запрос:
votingapi_cache_node_users_percent_vote_average.value AS votingapi_cache_node_users_percent_vote_average_value,
users.name AS users_name
FROM users users
INNER JOIN node node_users ON users.uid = node_users.uid AND node_users.type = 'profile'
LEFT JOIN node node_users_node_users ON node_users.tnid = node_users_node_users.tnid
INNER JOIN votingapi_cache votingapi_cache_node_users_percent_vote_average ON node_users_node_users.nid = votingapi_cache_node_users_percent_vote_average.content_id
AND (votingapi_cache_node_users_percent_vote_average.content_type = 'node' AND votingapi_cache_node_users_percent_vote_average.value_type = 'percent'
AND votingapi_cache_node_users_percent_vote_average.tag = 'vote' AND votingapi_cache_node_users_percent_vote_average.function = 'average')
WHERE users.uid NOT IN ('0')
ORDER BY users_name ASC
Посмотрел, потестировал - всё портит строка "LEFT JOIN node node_users_node_users ON node_users.tnid = node_users_node_users.tnid", без неё запрос правильный. Поддержка многоязычности в типе profile отключена.
Я так понимаю, подобная строка должна была бы появляться, если бы была включена многоязычность в типе, но почему появляется сейчас - не понимаю. И, как мне кажется, вообще объединять джоином таблицу саму с собой - дурацкая затея, а для многоязычности надо было писать код в WHERE.
Подскажите, пожалуйста, как с этим быть и как бороться.
Сам я не знаю как исправить sql-запрос, так что пока у меня напрашиваются 2 варианта:
1. Просто не использовать это поле.
2. Поизучать voting API и сделать так, чтобы голоса в комментариях причисляли не ноде-профилю, а пользователю.
Комментарии
Я так понял, что Вы используете вьюз, у которого основная таблица - users, а можно ведь сделать вьюз из материалов типа profile, создаваемых модулем content_profile, и если там что-то дополнительно из таблицы users тянуть, то подключать ее уже, а основная будет node. Запрос будет верный.
Точно, можно и так, про этот вариант забыл, спасибо.
Но всё-таки хочется узнать, баг это или хитрый замысел разработчиков views.
Views -- умный, но все же автоматический построитель запроса. Бывает, что его заносит. Я бы тут покрутил с Relations и PHP-сниппетами в аргументах.