Ошибка sql-запроса во views

Главные вкладки

Аватар пользователя Kail@drupal.org Kail@drupal.org 27 ноября 2009 в 23:21

На сайте для возможности писать отзывы пользователей на друг друга использую Content Profile и Fivestar Extra. Пользователи пишут комментарий к ноде-профилю и ставят оценку с помощью fivestar.
Начал писать во views выборку пользователей (имя, uid, дата создания и т.д.), захотел отображать так же и среднюю оценку. Создаю связь "Материал: Content Profile", а так же "Материал: Vote results", которая использует первую. Добавляю поле "Vote results: Значение", и... там на каждого пользователя по несколько значений, а у пользователей одинаковые значения. Стал разбираться.

Сам SQL-запрос:

SELECT users.uid AS uid,
   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 и сделать так, чтобы голоса в комментариях причисляли не ноде-профилю, а пользователю.

Комментарии

Аватар пользователя gorr gorr 28 ноября 2009 в 10:22

Я так понял, что Вы используете вьюз, у которого основная таблица - users, а можно ведь сделать вьюз из материалов типа profile, создаваемых модулем content_profile, и если там что-то дополнительно из таблицы users тянуть, то подключать ее уже, а основная будет node. Запрос будет верный.

Аватар пользователя Kail@drupal.org Kail@drupal.org 28 ноября 2009 в 17:26

Точно, можно и так, про этот вариант забыл, спасибо.

Но всё-таки хочется узнать, баг это или хитрый замысел разработчиков views.

Аватар пользователя theСанитар theСанитар 28 ноября 2009 в 19:40

Views -- умный, но все же автоматический построитель запроса. Бывает, что его заносит. Я бы тут покрутил с Relations и PHP-сниппетами в аргументах.