【问题标题】:Create variable in SQL script before doing queries在执行查询之前在 SQL 脚本中创建变量
【发布时间】:2020-05-01 03:40:57
【问题描述】:

我有以下sn-p

select user_id into @selected_user from users where mail = 'mymail@gmail.com';
select * from kc_network_user where user_id = 'previous_id';

我想将其修改为参数化。我找到了以下资源:

  1. Using variables in SQL script
  2. How to declare a variable in MySQL?
  3. Declare variables - MySQL Workbench 给我一个错误 DECLARE

这就是我所做的:

 select @user_mail := 'mymail@gmail.com'; #1
select @user_mail; #2
select user_id into @selected_user from user where mail = @user_mail; #3
select @selected_user;
select * from user_network where user_id = @selected_user; #4

在选择 #1 时,我还尝试了以下方法:

set @user_mail = 'mymail@gmail.com';

select #2 返回正确的值,因此变量被初始化。
选择#3 返回如下错误:

错误代码:1267。非法混合排序规则 (utf8mb4_unicode_ci,IMPLICIT) 和 (utf8mb4_general_ci,IMPLICIT) 操作'='

虽然选择 #4 运行正常(如果我使用文字值设置邮件参数)。

这些查询之间有什么区别? 如何在查询前设置变量?

【问题讨论】:

  • 'MySQL Workbench 给我一个 DECLARE 错误' - 声明变量只能在存储程序(过程、函数、触发器、事件)中使用。
  • select #3 返回以下错误 mail 排序规则由数据库、表或字段设置定义。 @user_mail 排序规则由您的​​连接设置定义(公平)。它们不同且不可强制,因此会产生错误。
  • 但是您可以设置会话排序规则 - 请在此处查看来自 grid vost 的答案stackoverflow.com/questions/28540772/using-utf8mb4-in-mysql。顺便说一句,当它可以在 1 个查询中完成时,你这样做是有原因的。
  • 谢谢,我想这就是我收到该错误的原因。我不明白如何在我的具体情况下应用它。

标签: mysql variables


【解决方案1】:

我不明白为什么不简单

select * 
from user_network
join user using (user_id)
where user.mail = 'mymail@gmail.com';

如果您需要另外设置提到的变量(但出于什么原因?)然后使用

select *, (@selected_user := user.user_id) 
from user_network
join user using (user_id)
where user.mail = (@user_mail := 'mymail@gmail.com');

【讨论】:

  • 因为我必须处理许多表和不同的查询。一个一个地管理所有这些查询会很困难,而只管理一些“全局”变量会更容易。
猜你喜欢
  • 2019-02-24
  • 1970-01-01
  • 2019-01-09
  • 2017-01-07
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
  • 1970-01-01
  • 2017-06-11
相关资源
最近更新 更多