mySQL存储过程,带变量方法、查询和限制

mySQL存储过程,带变量方法、查询和限制,mysql,stored-procedures,Mysql,Stored Procedures,您好,我是mySQL的新手,我正在尝试编写一个存储过程。我在网上搜索过类似的问题,但找不到任何结果 我正在尝试为我的Web应用程序创建搜索功能,您可以在数据库中搜索结果,但有不同的搜索方法(按姓名、姓氏、地址等)。查询的结果也应该有限制(1、5、10、20)。我的想法是这样的: CREATE PROCEDURE SelectTopResults @query varchar(60), @method varchar(20), @limited int(3) AS SELECT * FROM cu

您好,我是mySQL的新手,我正在尝试编写一个存储过程。我在网上搜索过类似的问题,但找不到任何结果

我正在尝试为我的Web应用程序创建搜索功能,您可以在数据库中搜索结果,但有不同的搜索方法(按姓名、姓氏、地址等)。查询的结果也应该有限制(1、5、10、20)。我的想法是这样的:

CREATE PROCEDURE SelectTopResults @query varchar(60), @method varchar(20), @limited int(3)
AS
SELECT * FROM customer WHERE @method = %@query% LIMIT @limited
GO;
这没有运行。这个程序的想法正确吗?那我该怎么修呢?还是有其他更好的方法

提前谢谢


编辑: 这可以通过PHP访问。 我的想法是编写一个代码,基本上可以:

$sql = 'EXEC SelectTopResults @method = ?, @query = ?, @limited = ?;'

编辑2: 已解决,非常感谢!:)

对于那些对代码感兴趣的人:

DELIMITER //
CREATE PROCEDURE selectTopResults(IN col varchar(64), IN limited int(3), searchquery varchar(60))
BEGIN
    SET @s = CONCAT("SELECT * FROM customer WHERE ",col," LIKE '%",searchquery,"%' LIMIT ",limited);
    PREPARE stmt FROM @s;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END
//
DELIMITER ;
也适用于通配符,可通过以下方式调用:

CALL selectTopResults('column_name', 5, 'query');

其中5是限制

欢迎来到论坛。您的理解有点错误-MySQL手册中有一些关于存储过程的内容,但我在第一次尝试时始终找不到。幸运的是,如果你在谷歌、必应或其他网站上搜索,这里有很多教程。试试这个,例如:

因此,要使您的程序正常工作:

DELIMITER $$

CREATE PROCEDURE SelectTopResults (
  query varchar(60), 
  method varchar(20), 
  limited int(3)
)
BEGIN
  ...
END$$

DELIMITER ;
使用
分隔符
语句来更改表示语句结束的内容是正常的,否则,当您在过程中键入语句时,将收到错误消息。接下来,您需要在参数周围使用圆括号,并且在参数名称之前不使用
@

你可能想知道为什么我把参数列表分成几行;这正是我的风格——我觉得它使参数的起点和终点更容易阅读。最后,关于您的
SELECT
语句:

SELECT * FROM customer WHERE @method = %@query% LIMIT @limited
我不确定您在这里尝试的是什么-首先,您需要松开
@
s-这是针对您使用
set
设置的变量,我相信(我是从内存中编写的,因为我不在手册附近),而不是针对过程或函数中的变量和参数。但更重要的是,不能将参数
方法
用作表列的名称-为此,需要将
选择
构造为字符串并执行。据我回忆,这就是所谓的“动态SQL”;我想你可以在MySQL中实现这一点,但如果不查一下,我不确定


我希望这会有所帮助,希望有更直接的知识的人能更好地帮助你。

欢迎来到论坛。您的理解有点错误-MySQL手册中有一些关于存储过程的内容,但我在第一次尝试时始终找不到。幸运的是,如果你在谷歌、必应或其他网站上搜索,这里有很多教程。试试这个,例如:

因此,要使您的程序正常工作:

DELIMITER $$

CREATE PROCEDURE SelectTopResults (
  query varchar(60), 
  method varchar(20), 
  limited int(3)
)
BEGIN
  ...
END$$

DELIMITER ;
使用
分隔符
语句来更改表示语句结束的内容是正常的,否则,当您在过程中键入语句时,将收到错误消息。接下来,您需要在参数周围使用圆括号,并且在参数名称之前不使用
@

你可能想知道为什么我把参数列表分成几行;这正是我的风格——我觉得它使参数的起点和终点更容易阅读。最后,关于您的
SELECT
语句:

SELECT * FROM customer WHERE @method = %@query% LIMIT @limited
我不确定您在这里尝试的是什么-首先,您需要松开
@
s-这是针对您使用
set
设置的变量,我相信(我是从内存中编写的,因为我不在手册附近),而不是针对过程或函数中的变量和参数。但更重要的是,不能将参数
方法
用作表列的名称-为此,需要将
选择
构造为字符串并执行。据我回忆,这就是所谓的“动态SQL”;我想你可以在MySQL中实现这一点,但如果不查一下,我不确定


我希望这会有所帮助,希望有更直接的知识的人能更好地帮助您。

您不能使用参数生成动态查询。这有点令人担忧-这就是sqlserver语法。这个问题标记正确吗?如果标记正确,你应该扔掉所有你从中获得的代码,找到一个mysql教程。你不能使用参数生成动态查询。这有点令人担忧-这就是sqlserver语法。这个问题标记正确吗?如果它被正确地标记,你应该扔掉你从中得到的代码,并找到一个mysql教程