我正在构建一个简单的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。
任何人都可以告诉我该怎么做才能实现它?!
答案 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查询之前: