如何将两列合并为一列?

40
我正试图使用PHP从MySQL数据库中搜索两个字段作为一个字段。例如:
mysql_query("
  SELECT (first_name,last_name) As name
  FROM people
  WHERE (name LIKE '%" . $term . "%')
");

我本以为这是要使用的代码,但无济于事。我已经有一段时间没有做过这个了,无法确切记得如何实现所需的结果。

2个回答

88
你正在寻找 CONCAT 函数。
mysql_query("SELECT CONCAT(first_name, last_name) As name FROM people WHERE (CONCAT(first_name, last_name) LIKE '%" . $term . "%')");

甚至可以使用`using System.Runtime.CompilerServices;`声明一个扩展方法:

namespace MyExtensionMethods {<br>    public static class MyExtensions<br>    {<br>        // This method allows you to call MyObject.MyMethod() as if it were an extension method.<br>        public static void MyMethod(this MyObject obj)<br>        {<br>            obj.DoSomething();<br>        }<br>    }<br>}
mysql_query("SELECT CONCAT(first_name, ' ', last_name) As name FROM people WHERE (CONCAT(first_name, ' ', last_name) LIKE '%" . $term . "%')");

我无法解释这背后的原因(但或许有人可以留言解释?),但你不能使用name别名来查找两个字段,你必须再次显式地使用CONCAT


4
@Vache,在where子句中不能使用别名,因为where子句可能会在解析别名之前执行。如果要使用别名,请将其放在having子句中。然而,这可能会影响查询的运行时间,因为你正在强制SQL在应用过滤器之前解决别名。 - Johan
如果我不使用 WHERE (name LIKE '%". $term ."'),它是可以工作的,但是当使用 like 时就不行了。 - Bobby
如果您想在过滤器中使用别名,请重写查询为:SELECT CONCAT(first_name,' ',last_name) AS name FROM people HAVING name LIKE 'Vache IAm' - Johan
好的,如果我这样做,它就能工作了:mysql_query("SELECT * FROM users WHERE CONCAT(first_name,' ',last_name) LIKE '%" . $term . "%'"); - Bobby
@Bobby,“select *”是SQL反模式。出于许多原因,这是一个不好的想法。始终明确命名您的列。 - Johan
如果我们想将未知数量的列合并为一列怎么办?例如,如果子查询可以输出多行,我们可以将它们放入一个列中,而不是收到错误信息? - C4d

4

1
我经常使用这两个函数 - 如果任何值为空,concat返回null - 这有时可能很有用 concat(distance, 'km') - 但更常见的情况是使用concat_ws更好,例如:concat_ws(' ', first, middle, last) - ErichBSchulz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接