Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL联合查询中的行名称相同_Php_Mysql_Sql - Fatal编程技术网

Php MySQL联合查询中的行名称相同

Php MySQL联合查询中的行名称相同,php,mysql,sql,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 .

我正在构建一个简单的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


有谁能告诉我我该怎么做才能实现它

这是使用UNION运算符的结果—它根据查询中第一个表的名称命名列。
如果我正确理解了您的要求,请参阅

您可以使用类似以下内容:

$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 ."%')
";
SELECT id, val1 AS 〈I_wanna_name_this_column_as_qq_if_id_is_less_than_17_and_as_pp_otherwise〉, val2 FROM tbl1;
但我觉得这是一种奇怪的方式。 如果必须在多个表中搜索某些内容(结构和列数可能不同),最好只运行几个查询


事实上,查询结果的“结构”(即列数、列名称和类型)必须是可确定的,而无需执行查询

也就是说,假设您有一个表
tbl1
,其中有字段
(id integer,creation\u time timestamp,val1 text,val2 text)
,并且要执行查询
从tbl1中选择id,id+2作为id加上2,creation\u time作为cr\u time。即使不执行查询,RDBMS也会理解结果结构应该是
(id整数、id\u加上\u 2整数、cr\u时间戳)

因此,你不能做这样的事情:

$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 ."%')
";
SELECT id, val1 AS 〈I_wanna_name_this_column_as_qq_if_id_is_less_than_17_and_as_pp_otherwise〉, val2 FROM tbl1;
或:

使用查询的联合也是如此。RDMBS必须在读取查询后立即知道UNION查询结果的结构(假设它已经知道表的结构)。因此,即使在执行UNION查询之前:

  • RDMBS尝试确定整个联合查询将返回的列数(通过查看特定SELECT查询预期返回的列数)。如果UNION查询中的两个SELECT查询预期返回不同的列数,那么这是错误的
  • RDMBS尝试确定整个联合查询将返回的列类型(通过查看特定SELECT查询预期返回的列类型)。如果UNION查询中两个SELECT查询中对应列的类型差异太大(RDBMS无法将它们转换为公共超类型),那么这是错误的
  • RDMBS尝试确定整个联合查询将返回的列的名称(通过查看特定SELECT查询预期返回的列的名称)。如果UNION查询中两个SELECT查询中对应列的名称不同——这并不重要,RDBMS将取第一个。(从理论上讲,这并不重要,RDBMS会以另一种方式设计第二种方式,或者甚至以某种方式将它们结合起来——但事实是,所有collumn名称都必须在不执行查询的情况下已知。)

这就是工作原理。如果第一个表有1列,第二个表有8列,会发生什么情况?列的名称是什么?为什么不试试看呢
UNION
不应允许在
SELECT
s中使用不同的列数。请确保在每个子查询的最终结果中包含所需的所有列。您可以在子查询中选择空字符串,将列留空。我不是一个懒惰的人,我只是不知道如何在具有相同列名的多个表中执行搜索。这个查询是我在谷歌上找到的,也是我一直想做的!这实际上并没有回答这个问题——什么才是得到他想要的东西的正确方法。我没有时间写一个完整的答案,但看到我在上面关于留空栏的评论。谢谢,伙计,这真的帮了大忙!!!我决定运行多个查询,但您的解释让我明白了!谢谢