我想要做的是将三个单独的表查询到一行,该行由唯一引用标识。我并不完全理解Join
子句,因为它似乎需要来自每个表的某种相关数据。
我知道我可以在很长一段时间内解决这个问题,但不能失去一点效率。任何帮助将不胜感激。
表格结构
package_id int(8),
client_id int(8),
unique reference varchar (40)
每个表具有基本相同的结构。我只需要知道如何查询所有三个,一行。
答案 0 :(得分:0)
假设你有3张桌子:
table1,table2和table3 with structure
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
答案 1 :(得分:0)
SELECT * FROM table1 t1 JOIN table2 t2 ON (t2.unique = t1.unique) JOIN table3 t3 ON (t3.unique = t1.unique) WHERE t1.unique = '?';
您可以使用这样的JOIN,假设所有三个表都具有相同的唯一列。
答案 2 :(得分:0)
如果几个表共享相同或相似的定义,则可以使用union或union all将它们视为一个。此查询将返回具有请求引用的每个表中的行。我已经包含了OriginTable
信息,以防您的代码需要引用原始表进行更新或其他内容。
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 = ?
您可以将选择列表与其他列一起扩展,前提是它们具有相同的数据类型,或者可以从第一次选择隐式转换为数据类型。
答案 3 :(得分:0)
完全可以使用where子句在表之间创建连接。事实上,这通常是我所做的,因为我发现它可以让您更清楚地了解您实际在做什么,如果您没有得到预期的结果,您可以逐点调试。
然而,那说加入肯定要快得多!
请记住,我在SQL上生气,所以我可能错过了记忆,我不打算包含任何代码,因为你没有说过你使用的DBMS,因为它们的代码略有不同
要记住的是,连接在一个列中具有相同的数据(和类型)。
如果每个表都具有相同的“连接”字段,则更容易,那么它应该是
的问题join on <nameOfField>
但是,如果您希望在不同的表中使用具有不同名称的字段,则需要列出完全限定的名称。即tableName.FieldName
如果你遇到自然,内在,外在,左,右的问题,你需要考虑一个维恩图,自然是表格之间的共同点。如果您只使用2个表,则内部和外部相当于左侧和右侧(每个表在维恩图中为一个圆圈),左侧和右侧是列表中您选择的主要部分中的表的顺序(第一个是左边,第二个是右边。
当您添加第三个表格时,您可以使用这些关键字选择任何交叉部分。
然而,我总是发现更容易进行主要选择并创建临时表,然后使用此临时表执行我的下一次连接(因此实际上只需要使用自然或左右再次)。我再次发现这更容易调试。
最好的事情是尝试并看看你得到的回报。没有表格图表,这是我能提供的最好的。
简而言之......
嵌套选择where where =(从table中选择field =)
和临时表
(我认为)更容易调试......但是需要更多的写作!
大卫。
答案 4 :(得分:0)
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
}