【问题标题】:MySql quick user selectMySql 快速用户选择
【发布时间】:2014-10-29 10:31:14
【问题描述】:

我有一个用户表,我正在使用 id 获取用户详细信息(通常方式)。

这就是我获取用户详细信息的方式;

select id,kullaniciadi,FotoGet(K.Foto,K.Gender) from kullanicilar K where id=1;

FotoGet 函数总是返回字符串值,例如 'Photos/ssss.jpg'

到目前为止,我使用这种方式并没有遇到麻烦,但我想知道如何使用单个函数来做到这一点? 喜欢

set @uid=1;
Select UserGet(@uid);

我会将id 放在括号内,该函数将运行我的选择查询并返回所有用户详细信息列。 idkullaniciadiFotoGet(K.id,K.Foto,K.Gender)

我可以使用这种方式获取详细信息吗?

【问题讨论】:

  • 为什么是 -1 ? :( 这只是一个没有高级别的问题。我们不是在做什么吗?问一个问题?来吧,伙计们,请不要判断这个问题。
  • 不要让反对票困扰您。总有一些抱怨认为这个问题是无效的,但这反映在他或她身上,而不是你身上。也许他或她只是总体上不喜欢 MySQL,并且认为任何人都不应该使用它或询问它。谁知道?

标签: mysql function select


【解决方案1】:

MySQL 存储函数不能返回多列,它只能返回单个标量值。

但您可以设计一个返回结果集的存储过程:

CREATE PROCEDURE UserGet(uid INT)
  SELECT id, kullaniciadi, FotoGet(K.Foto,K.Gender) FROM kullanicilar K WHERE id=uid;

然后这样称呼它:

CALL UserGet(1234);

它返回一个结果集,就像 SELECT 查询一样。


DELIMITER //

CREATE PROCEDURE UserGet(IN uid INT, IN column_name VARCHAR(64))
BEGIN
  SET @sql = CONCAT('SELECT id, ', column_name, ' FROM kullanicilar K WHERE id=?');
  PREPARE stmt FROM @sql;
  SET @uid = uid;
  EXECUTE stmt USING @uid;
END//

DELIMITER ;

这样称呼它:

CALL UserGet(1234, 'kullaniciadi');

请记住,编写代码以将有效的列名作为过程参数传递是您的责任。如果允许传递不可信的内容,则可能是 SQL 注入漏洞。


关于您的补充评论:

这应该可以正常工作:

CALL UserGet(1234, 'FotoGet(Foto,Gender)');

【讨论】:

  • 我可以在参数中获取行名吗?像 CREATE PROCEDURE UserGet(uid INT, rows) SELECT rows FROM kullanicilar K WHERE id=uid;
  • 你一定是指列名?是的,但这更复杂。您必须使用 PREPARE 和 EXECUTE,然后您必须学习如何保护您的代码免受 SQL 注入。我并不是要侮辱,但如果您不知道“行”和“列”之间的区别,那么您可能还没有准备好。我建议您现在坚持获取一组固定的列。
  • 很抱歉,我的英语不太好。我在想列(在我的语言中。是 sütun)但是我写了行:(。你能给我一个在参数中获取列名的例子
  • @traBolics,见上面的例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
  • 2015-02-07
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多