我正在构建一个简单的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 ."%')";
问题是,即使结果来自第二个表,列名称分别是pergunta和resposta,我却获得了具有相同列名txt1_festival和txt2_festival的所有结果。
谁能告诉我该怎么做?!
如果我正确理解了您想要什么...
您可以使用以下方式:
$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查询之前:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句