мануальная косинус сходство матлаб [дубликат]

Я бы просто добавил 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
5
задан Eitan T 15 January 2013 в 17:05
поделиться

1 ответ

Простейшим решением было бы вычисление норм сначала с использованием умножения по элементам и суммирования по требуемым размерам:

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);
5
ответ дан Eitan T 26 August 2018 в 19:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: