Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类MySQL关键字未返回预期结果_Mysql_Sql_Database - Fatal编程技术网

类MySQL关键字未返回预期结果

类MySQL关键字未返回预期结果,mysql,sql,database,Mysql,Sql,Database,我有一个与我创建的搜索函数一起使用的存储过程。过程中的查询如下所示: CREATE DEFINER=`root`@`localhost` PROCEDURE `advanced_search`(IN major_name VARCHAR(45), OUT major_code INT, IN classification VARCHAR(45), IN job_class VARCHAR(45)) BEGIN SELECT major_id INTO major_code FROM m

我有一个与我创建的搜索函数一起使用的存储过程。过程中的查询如下所示:

    CREATE DEFINER=`root`@`localhost` PROCEDURE `advanced_search`(IN major_name VARCHAR(45), 
OUT major_code INT, IN classification VARCHAR(45), IN job_class VARCHAR(45))
BEGIN
SELECT major_id INTO major_code FROM major 
WHERE major = major_name;

SET @classification = classification;
SELECT * FROM job WHERE (major = major_code) OR (classification LIKE '%@classification%') OR (job_type = job_class);
END
我对LIKE关键字子句有问题。我想检查classification字段中的值是否包含@classification变量。出于某种原因,当我挑出使用该关键字的子句时(通过删除WHERE语句中的第一和第三个子句),它不会返回任何内容

关于如何解决这个问题,有什么建议吗

此外,在结果对象中找到下面显示的对象是否很常见

    {
  "fieldCount": 0,
  "affectedRows": 0,
  "insertId": 0,
  "serverStatus": 34,
  "warningCount": 0,
  "message": "",
  "protocol41": true,
  "changedRows": 0
}
编辑:这是我调用的查询

set @major_name = 'Chemical Engineering';
set @major_code = 0;
set @classification = 'Freshman';
set @job_class = 'Assistant';
call aggie_soop.advanced_search(@major_name, @major_code, @classification, @job_class);


这些就是结果。这与原始表格完全相同

需要稍作更改:

 CREATE DEFINER=`root`@`localhost` PROCEDURE `advanced_search`(IN major_name VARCHAR(45), 
OUT major_code INT, IN classification VARCHAR(45), IN job_class VARCHAR(45))
BEGIN
SELECT major_id INTO major_code FROM major 
WHERE major = major_name;

SET @classification = classification;
SELECT * FROM job WHERE (major = major_code) OR (classification LIKE '%' || @classification || '%') OR (job_type = job_class);
END

我认为您不需要用户定义的变量,您可以引用过程参数

可以使用MySQL CONCAT()函数将百分号文字与值连接起来

我更喜欢限定所有列引用,并对过程变量使用命名约定,以避免名称冲突。虽然MySQL并不在意,但它使未来的读者更容易理解其意图

CREATE DEFINER=`root`@`localhost`
PROCEDURE `advanced_search`
( IN  p_major_name     VARCHAR(45)
, OUT p_major_code     INT
, IN  p_classification VARCHAR(45)
, IN  p_job_clas       VARCHAR(45)
)
BEGIN
  SELECT m.major_id INTO p_major_code
    FROM major m
   WHERE m.major = p_major_name
   LIMIT 1
  ;
  SELECT j.*
    FROM job j
   WHERE (j.major = p_major_code)
      OR (j.classification LIKE CONCAT('%',p_classification,'%')
      OR (j.job_type = p_job_class)
  ;
END
(我相信可以在过程中“读取”OUT参数的值,但我以前从未这样做过。)

请注意,如果p_分类字符串是长度为零的字符串,则将返回分类列中具有非空值的每一行

您可能需要以下内容:

      OR (p_classification <> '' AND j.classification LIKE CONCAT('%',p_classification,'%')
OR(p_分类法”和j.分类法,如CONCAT(“%”,p_分类法“%”)

(但规格不明确。)

感谢您,不知什么原因,我收到一个错误,说我缺少%符号周围的右括号。我正在MySQL Workbench中编辑查询,但已修复了连接运算符。确定添加了编辑,现在它将提供表中的所有内容,即使分类变量不在列中。这是因为或条件您的查询中的选项。基本上是指将(major=major|u code)或(分类如“%”或“%”或(job|u type=job|u class)中的任何行。因此,如果其中任何一个条件为TRUE,则选中该行。这可能会带来比具有特定分类的行更多的行。如果您发布源数据和预期结果的示例,我们可以调整您的查询。但有一点是肯定的:您编写的查询似乎工作正常。因此,您似乎没有询问数据请以正确的方式回答。感谢您的回答!尝试您的解决方案后,我得到了与Walter相同的结果。此答案中的查询使用字符串连接函数CONCAT().操作。Walter回答中的查询使用逻辑OR运算符。在某些情况下,查询的结果可能相同,但很容易演示查询返回不同结果的情况。(正如我在回答中指出的,如果“p_分类”参数为空字符串,查询将返回表中分类列中具有非空值的所有行。