Почему view показывает ошибку на реальном сервере?

Аватар пользователя VasyOK VasyOK 3 июня в 9:26

Всем привет.
Есть представление. Выводит количество комментариев пользователя.
Под docker4druapal все работает, но на реальном сервере показывает ошибку.

Представление.


Его запрос.

SELECT "comment_field_data"."cid" AS "cid", "users_field_data_comment_field_data"."uid" AS "users_field_data_comment_field_data_uid", COUNT(comment__comment_body.comment_body_value) AS "comment__comment_body_comment_body_value", COUNT(comment__comment_body.delta) AS "comment__comment_body_delta", COUNT(comment__comment_body.langcode) AS "comment__comment_body_langcode", COUNT(comment__comment_body.bundle) AS "comment__comment_body_bundle", COUNT(comment__comment_body.comment_body_format) AS "comment__comment_body_comment_body_format"
FROM
{comment_field_data} "comment_field_data"
LEFT JOIN {users_field_data} "users_field_data_comment_field_data" ON comment_field_data.uid = users_field_data_comment_field_data.uid
LEFT JOIN {comment__comment_body} "comment__comment_body" ON comment_field_data.cid = comment__comment_body.entity_id AND (comment__comment_body.deleted = '0' AND comment__comment_body.langcode = comment_field_data.langcode)
WHERE "users_field_data_comment_field_data"."uid" = '1'


Ошибка.

SQLSTATE[42000]: Syntax error or access violation: 1140 In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'dbname.comment_field_data.cid'; this is incompatible with sql_mode=only_full_group_by: SELECT "comment_field_data"."cid" AS "cid", "users_field_data_comment_field_data"."uid" AS "users_field_data_comment_field_data_uid", COUNT(comment__comment_body.comment_body_value) AS "comment__comment_body_comment_body_value", COUNT(comment__comment_body.delta) AS "comment__comment_body_delta", COUNT(comment__comment_body.langcode) AS "comment__comment_body_langcode", COUNT(comment__comment_body.bundle) AS "comment__comment_body_bundle", COUNT(comment__comment_body.comment_body_format) AS "comment__comment_body_comment_body_format" FROM "comment_field_data" "comment_field_data" LEFT JOIN "users_field_data" "users_field_data_comment_field_data" ON comment_field_data.uid = users_field_data_comment_field_data.uid LEFT JOIN "comment__comment_body" "comment__comment_body" ON comment_field_data.cid = comment__comment_body.entity_id AND (comment__comment_body.deleted = :views_join_condition_0 AND comment__comment_body.langcode = comment_field_data.langcode) WHERE "users_field_data_comment_field_data"."uid" = :db_condition_placeholder_2; Array ( [:db_condition_placeholder_2] => 1 [:views_join_condition_0] => 0 )

Не слишком большое насилие над БД?
Может постараться использовать статистику комментария для данного действа?

Лучший ответ

Аватар пользователя marassa marassa 5 июня в 11:42
1

Посмотри патчик вот здесь, может поможет. Насколько я понял, Друпал сам устанавливает всякие параметры SQL при инициализации сессии БД, так что всё, что ты установишь вне Друпала, будет им затёрто.

Комментарии

Аватар пользователя marassa marassa 3 июня в 9:36

VasyOK wrote: Почему view показывает ошибку на реальном сервере?

Потому что разные настройки SQL-сервера. На одном включено sql_mode=only_full_group_by, а на другом выключено.

Аватар пользователя marassa marassa 3 июня в 10:19
1

Ну так оно ж английским по белому прям в сообщении об ошибке написано Wink
Есличё, я практически ничего не понимаю в версиях и разновидностях SQL-серверов, я просто очень хорошо умею читать сообщения об ошибках Wink

Аватар пользователя ivnish ivnish 3 июня в 9:37

Версии СУБД (mysql, mariadb) на локалке и на сервере одинаковые? Если нет, то сделай на локалке такую же версию, как на сервере и проверь еще раз

Аватар пользователя VasyOK VasyOK 4 июня в 14:04

Админ-баши сервера отвечает
"Глобальная переменная sql_mode пустая, но вы можете выставлять её самостоятельно для своей сессии."

Глобально выставить не получается:

mysql> SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
ERROR 1227 (42000): Access denied; you need (at least one of) the SUPER privilege(s) for this operation

Если для сессии то как?
SET SESSION sql_mode = 'modes'; - - так? что тут вписывать вместо 'modes' ?

Попробовал так:

SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Query OK, 0 rows affected (0,00 sec)

Но вьюха все равно ошибку выдает.

Аватар пользователя marassa marassa 5 июня в 11:42
1

Посмотри патчик вот здесь, может поможет. Насколько я понял, Друпал сам устанавливает всякие параметры SQL при инициализации сессии БД, так что всё, что ты установишь вне Друпала, будет им затёрто.