Php Mysql查询以检查3个表中的现有行
我要做的是将三个单独的表查询到一行中,该行由唯一引用标识。我并没有完全理解Join子句,因为它似乎需要来自每个表的某种相关数据 我知道我可以在这方面走很长的路,但不能失去一点效率。任何帮助都将不胜感激 表结构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
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
}