MySQL UNION查询中的相同行名称

时间:2014-02-05 20:13:33

标签: php mysql sql

我正在构建一个简单的php搜索引擎,它将在多个表中进行搜索。 有些表具有相同的列名,因此我开始使用“AS”来标识每个表。

这是我正在使用的查询:

$query = " (SELECT coluna1 as txt1_festival, coluna2 as txt2_festival, 'festival' as tabela FROM tb_festival WHERE coluna1 LIKE '%" . $buscar . "%' OR coluna2 LIKE '%" . $buscar ."%') 
    UNION
(SELECT pergunta, resposta, 'faqs' as tabela FROM tb_faqs WHERE pergunta LIKE '%" . $buscar . "%' OR resposta LIKE '%" . $buscar ."%')";

问题是我得到的所有结果都使用相同的列名txt1_festival和txt2_festival,即使结果来自第二个表的列名称是pergunta和resposta。

任何人都可以告诉我该怎么做才能实现它?!

2 个答案:

答案 0 :(得分:0)

这是使用UNION运算符的结果 - 它按查询中第一个表的名称命名列。 请参阅documentation

答案 1 :(得分:0)

如果我理解了你想要的东西......

您可以使用以下内容:

$query = "
    (SELECT coluna1 as txt1_festival, coluna2 as txt2_festival, null as pergunta, null as resposta, 'festival' as tabela FROM tb_festival WHERE coluna1 LIKE '%" . $buscar . "%' OR coluna2 LIKE '%" . $buscar ."%') 
    UNION
    (SELECT null as txt1_festival, null as txt2_festival, pergunta, resposta, 'faqs' as tabela FROM tb_faqs WHERE pergunta LIKE '%" . $buscar . "%' OR resposta LIKE '%" . $buscar ."%')
";

但恕我直言,这是一种奇怪的做法。 如果你必须在几个表中搜索某些内容(结构和列数可能不同),最好只运行几个查询。


事实是,在不执行查询的情况下,查询结果的“结构”(即列数,名称和类型)必须是可确定的。

即。假设您的表tbl1包含字段(id integer, creation_time timestamp, val1 text, val2 text),并且将执行查询SELECT id, id+2 as id_plus_2, creation_time AS cr_time FROM tbl1。甚至不执行查询,RDBMS将理解结果结构应该是(id integer, id_plus_2 integer, cr_time timestamp)

因此你无法做到这样的事情:

SELECT id, val1 AS 〈I_wanna_name_this_column_as_qq_if_id_is_less_than_17_and_as_pp_otherwise〉, val2 FROM tbl1;

或:

SELECT id, val1, val2 AS 〈I_wanna_name_this_column_as_qq_if_today_is_tuesday_and_as_pp_otherwise〉 FROM tbl1;

与使用UNION的查询相同。在读取查询之后,RDMBS必须知道UNION查询结果的结构(假设它已经知道表的结构)。因此,甚至在执行UNION查询之前:

  • RDMBS尝试确定整个UNION查询将返回的列数(通过查看特定SELECT查询预期返回的列数)。如果期望UNION查询中的两个SELECT查询返回不同数量的列 - 那就是错误。
  • RDMBS尝试确定整个UNION查询将返回的列类型(通过查看特定SELECT查询预期返回的列类型)。如果UNION查询中两个SELECT查询中相应列的类型太不相同(RDBMS无法将它们转换为常用超类型) - 这是错误的。
  • RDMBS尝试确定整个UNION查询将返回的列的名称(通过查看特定SELECT查询应返回的列的名称)。如果UNION查询中两个SELECT查询中相应列的名称不同 - 它不是那么重要,RDBMS会先占用一个。 (从理论上讲,它不是那么重要,并且设计为另一种方式RDBMS将采用第二种方式,或者甚至以某种方式组合它们 - 但事实是必须知道所有的collumn名称而不执行查询。)