Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.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查询以检查3个表中的现有行_Php_Mysql_Sql - Fatal编程技术网

Php Mysql查询以检查3个表中的现有行

Php Mysql查询以检查3个表中的现有行,php,mysql,sql,Php,Mysql,Sql,我要做的是将三个单独的表查询到一行中,该行由唯一引用标识。我并没有完全理解Join子句,因为它似乎需要来自每个表的某种相关数据 我知道我可以在这方面走很长的路,但不能失去一点效率。任何帮助都将不胜感激 表结构 package_id int(8), client_id int(8), unique reference varchar (40) 每个表的结构基本相同。我只需要知道如何为一行查询所有三个表。假设您有3个表: 表1、表2和表3的结构 package_id int

我要做的是将三个单独的表查询到一行中,该行由唯一引用标识。我并没有完全理解Join子句,因为它似乎需要来自每个表的某种相关数据

我知道我可以在这方面走很长的路,但不能失去一点效率。任何帮助都将不胜感激

表结构

    package_id int(8),
    client_id int(8),
    unique reference varchar (40)

每个表的结构基本相同。我只需要知道如何为一行查询所有三个表。

假设您有3个表:

表1、表2和表3的结构

package_id int(8),
client_id int(8),
unique reference varchar (40)
假设列引用是唯一键

然后你可以使用这个:

SELECT t1.exists_row ,t2.exists_row ,t3.exists_row FROM
(
    (SELECT COUNT(1) as exists_row FROM table1 t1 WHERE 
         t1.reference = @reference ) t1,
    (SELECT COUNT(1) as exists_row FROM table1 t2 WHERE 
         t2.reference = @reference ) t2,
    (SELECT COUNT(1) as exists_row FROM table1 t3 WHERE 
         t3.reference = @reference ) t3
) a
)

将@reference替换为唯一键的实际值

或者当您提供

SHOW CREATE TABLE
我可以用实际的查询重写SQL

SELECT * FROM table1 t1 JOIN table2 t2 ON (t2.unique = t1.unique) JOIN table3 t3 ON (t3.unique = t1.unique) WHERE t1.unique = '?';

您可以使用这样的联接,假设所有三个表都具有相同的唯一列。

如果有几个表共享相同或类似的定义,则可以使用union或union all将它们视为一个。此查询将返回具有请求引用的每个表中的行。我已经包含了原始表信息,以防您的代码需要参考原始表进行更新或其他操作

select 'TableA' OriginTable, 
       package_id, 
       client_id
  from TableA
 where reference = ?
 union all
select 'TableB' OriginTable, 
       package_id, 
       client_id
  from TableB
 where reference = ?
 union all
select 'TableC' OriginTable, 
       package_id, 
       client_id
  from TableC
 where reference = ?

您可以使用其他列扩展select列表,前提是它们具有相同的数据类型,或者可以从第一个select隐式转换为数据类型。

完全可以使用where子句在表之间创建联接。事实上,这是我经常做的,因为我发现它可以让你更清楚地了解你实际上在做什么,如果你没有得到预期的结果,你可以一点一点地调试它

尽管如此,加入当然要快得多

请记住,我对SQL很生疏,所以我可能没有记住,我不会包含任何代码,因为您没有说明您使用的是什么DBMS,因为它们的代码都略有不同

需要记住的是,连接函数在一个列中使用相同的数据和类型

如果每个表都有一个名为相同的“连接”字段,那么就容易多了,这应该是一个简单的问题

join on <nameOfField>
但是,如果希望在不同的表中使用具有不同名称的字段,则需要列出完全限定名称。ie tableName.FieldName

如果您在自然、内部和外部、左侧和右侧方面遇到问题,您需要考虑一个维恩图,其中自然是表之间的共同点。如果仅使用两个表,则内部和外部的表相当于左侧和右侧,每个表在维恩图中是一个圆圈,左侧和右侧是列表中表在主要部分的顺序,请选择第一个是左侧,第二个是右侧

当您添加第三个表时,您可以在这里使用这些关键字选择任何横截面

然而,我总是发现做一个主选择并创建一个临时表更容易,然后使用这个临时表执行下一次连接,所以有效地只需要再次使用natural或left and right。我再次发现这更容易调试

最好的办法是进行实验,看看你能得到什么回报。没有你的桌子的图表,这是我能提供的最好的了

简言之

嵌套选择字段=从字段=

和临时表

我认为调试更容易吗。。。但一定要多写


David.

将表格结构作为参考。。如果没有它,你怎么能给你建议呢?我尝试了很多方法,主要是使用Join,但我对这方面的知识有限。似乎它们都需要相关数据,但没有一个数据具有任何类型的关系。这三个表是否与一个公共表相关?不,我试图在传递唯一引用时查找一行,该引用可以是许多不同的组合,并且可以位于任一表中。如果仅在表2中找到引用值,该怎么办?对不起,没有意识到这是一个条件。使用内部联接应该可以实现这一点。如果只有table2具有该值,则不会返回任何内容。所有表都必须匹配条件,但正如我所说的,我想避开多个查询。
array_of_tables[]; // contain name of each table

foreach(array_of_tables as $val)
{
    $query="select * from `$val` where $condition "; // $conditon 
    $result=mysqli_query($connection,$query);
    $result_row[]=mysqli_fetch_assoc($result); // if only one row going to return form each table
    //check resulting array ,for your row
}