【问题标题】:mysql concatenated string with row value as column name for every row in select query (only by query)mysql连接字符串,行值作为选择查询中每一行的列名(仅通过查询)
【发布时间】:2016-01-02 04:37:39
【问题描述】:

下面是我的表TABLE

id   colname1   colname2     colname3
1    Alex       John         Mary
2    Alyssa     Eben         Stephen
3    Sandra     Tina         William

我尝试使用下面的查询

SELECT * FROM TABLE WHERE CONCAT('colname',id) = 'Eben'

我预计结果将来自第二行第二列。但我什么也得不到。我参考了许多指导使用 GROUP_CONCAT 的解决方案,但我没有任何工作。 用mysql可以做到这一点吗?

【问题讨论】:

  • 这不起作用的原因是因为它将CONCAT('colname', id) 视为字符串,而不是实际的列名。所以因为 'colname1' = 'Eben' 总是假的,你不会得到任何结果。不确定解决方案是什么,这就是我没有回答的原因,但希望了解它失败的原因会有所帮助哈哈。
  • 谢谢。会尝试其他方式。
  • 我也会做一些研究并在找到答案时发布答案。
  • 我找到了这个,如果你正在寻找一个特定的 id 值,它可以工作,但检查整个表格有点棘手:stackoverflow.com/questions/13282718/…
  • 看起来和我预期的一样。试了几次。将给予更多尝试,直到得到解决方案。

标签: mysql concatenation


【解决方案1】:

你可以试试动态sql。使用您的选择填充字符串变量,例如: DECLARE @str varchar(50) = 'SELECT * FROM TABLE WHERE colname@id = ''' + 'Eben' + '''' 然后将占位符字符串(“@id”)替换为您想要的列号,例如: 选择替换(@str,'@id',2)

最后真正执行语句只需使用“EXEC”+语句。 IE: 执行 (@str)

【讨论】:

  • 我假设您希望能够通过与 ID 连接的“colname”来引用某个列。
  • 对不起杰弗里。我的意思是“你是对的”,我希望能够通过与 ID 连接的“colname”来引用某个列。但是.. 并不是说​​该解决方案对我有用。
  • 好的。但是使用提供的代码,您可以做到这一点(通过替换字符串“@id”)。请让我知道缺少答案的地方。 -thx
  • 实际上我不确定如何执行您的代码,因为它显示 '[Err] 1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 'DECLARE @str varchar(50) = 'SELECT * FROM TABLE WHERE colname@id = ''' + 'Eben' ' at line 1' 附近使用正确的语法。
【解决方案2】:

我不得不创建另一个答案,因为这个论坛不允许我在 cmets 中使用 @(&)。

    DECLARE @str varchar(50) = 'SELECT * FROM TABLE WHERE colname@id = ''' +    
    'EBEN' + '''' 
    select @str = REPLACE(@str, '@id', 2)
    select @str '@str'  --This is just to examine the code, get the results of     
     --this and run it to test
--you should get this: SELECT * FROM TABLE WHERE colname2 = 'EBEN'
EXEC (@str) --this will actually execute your code

【讨论】:

  • 上面的查询是可以在navicat中使用还是应该在php中使用?因为我仍然得到同样的错误。
  • 我问了上面的问题,因为我只熟悉过程式的mysqli查询,我不经常使用面向对象的风格,为什么我不能成功运行你给出的解决方案。
  • 现在我有了这个代码。 $con=new PDO("mysql:host=10.10.10.10;dbname=TABLE","root","root@123"); $query=$con->prepare("DECLARE @str varchar(50) = 'SELECT * FROM TABLE WHERE colname@id = ''' + 'EBEN' + '''' select @str = REPLACE(@str, '@id', 2) select @str '@str' EXEC (@str)"); $query->execute(); $result=$query->fetchall(); //echo $result["id"]; foreach ($result as $key=>$value){ echo $key . "=" . $value; } echo count($result); $con=null;。这段代码运行但什么也没给出。计数显示为零。我哪里错了?
  • 抱歉,不熟悉您使用的语言(我猜是 PHP),但是您可以一次运行 sql 步骤吗?而且您可能不需要在您的 sql 中使用这段代码:选择 @str '@str'。另外,如果在你的语句中 $ query=$con->prepare... 你不能只使用某种类型的字符串变量,那么你只需要在那里对字符串进行替换,而不是在 sql 中?
  • 我想你通过使用命令行 sql 来指导我。如果是这样,那么我应该提高我的知识来做到这一点。
猜你喜欢
  • 2023-03-09
  • 2011-06-16
  • 2019-06-19
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多