Я бы просто добавил group_id
к GROUP BY
.
Когда SELECT
столбца, который не является частью GROUP BY
, может быть несколько значений для этого столбца внутри групп, но в результатах будет только одно место для одного значения. Таким образом, для базы данных обычно должно быть сказано точно, как сделать эти несколько значений одним значением. Обычно это выполняется с помощью агрегатной функции, такой как COUNT()
, SUM()
, MAX()
и т. Д. Я обычно говорю , потому что большинство других популярных систем баз данных настаивают на этом. Однако в MySQL до версии 5.7 поведение по умолчанию было более прощающим, потому что оно не будет жаловаться, а затем произвольно выбирает любое значение ! Он также имеет функцию ANY_VALUE()
, которая может быть использована в качестве другого решения для этого вопроса, если вам действительно необходимо такое же поведение, как и раньше. Эта гибкость стоит дорого, потому что она недетерминирована, поэтому я бы не рекомендовал ее, если у вас нет веских оснований для ее использования. MySQL теперь по умолчанию устанавливает параметр only_full_group_by
по уважительным причинам, поэтому лучше всего привыкнуть к нему и выполнить ваши запросы.
Итак, почему мой простой ответ выше? Я сделал несколько предположений:
1) group_id
уникален. Кажется разумным, это «идентификатор» в конце концов.
2) group_name
также уникален. Это может быть не такое разумное предположение. Если это не так, и у вас есть дубликат group_names
, и затем следуйте моему совету, чтобы добавить group_id
к GROUP BY
, вы можете обнаружить, что теперь у вас больше результатов, чем раньше, потому что группы с тем же именем будут теперь имеют отдельные строки в результатах. Для меня это было бы лучше, чем скрытие этих дублирующих групп, потому что база данных спокойно выбрала значение произвольно!
Также неплохо квалифицировать все столбцы с их именем таблицы или псевдонимами, когда задействовано более одной таблицы ...
SELECT
g.group_id AS 'value',
g.group_name AS 'text'
FROM mod_users_groups g
LEFT JOIN mod_users_data d ON g.group_id = d.group_id
WHERE g.active = 1
AND g.department_id = 1
AND g.manage_work_orders = 1
AND g.group_name != 'root'
AND g.group_name != 'superuser'
GROUP BY
g.group_name,
g.group_id
HAVING COUNT(d.user_id) > 0
ORDER BY g.group_name
Простейшим решением было бы вычисление норм сначала с использованием умножения по элементам и суммирования по требуемым размерам:
normA = sqrt(sum(A .^ 2, 2));
normB = sqrt(sum(B .^ 2, 1));
normA
и normB
теперь являются вектором столбца и вектором строки, соответственно. Для разделения соответствующих элементов в A * B
на normA
и normB
используйте bsxfun
следующим образом:
C = bsxfun(@rdivide, bsxfun(@rdivide, A * B, normA), normB);