0

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

我知道我可以做到这一点,但不能失去一点效率。任何帮助将不胜感激。

表结构

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

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

4

5 回答 5

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 = ?

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

于 2012-06-01T09:01:59.720 回答
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
}
于 2012-06-01T09:04:26.037 回答
0

假设您有 3 张桌子:

table1、table2 和 table3 的结构

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

于 2012-06-01T08:56:42.997 回答
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,假设所有三个表都具有相同的唯一列。

于 2012-06-01T08:57:40.257 回答
0

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

话虽如此,但是 join 写起来肯定要快得多!

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

要记住的是,连接函数作用于其中具有相同数据(和类型)的列。

如果每个表都有同名的“加入”字段,那就容易多了,那么这应该是一个问题

join on <nameOfField>

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

如果您在自然、内部和外部、左侧和右侧方面遇到问题,您需要考虑一个维恩图,其中自然是表格之间的共同点。如果您只使用 2 个表,内部和外部等效于左和右(每个表在维恩图中都是一个圆圈),左和右是您选择的主要部分中列表中表的顺序(第一个是左边,第二个是右边)。

当您添加第三个表格时,您可以使用这些关键字选择任何交叉部分。

然而,我总是发现更容易进行主选择并创建一个临时表,然后使用这个临时表执行我的下一个连接(因此实际上只需要再次使用自然或左右)。我再次发现这更容易调试。

最好的办法是进行实验,看看你会得到什么回报。如果没有您的表格图表,这是我能提供的最好的。

简单来说...

嵌套选择 where field = (从 table where field = 中选择)

和临时表

(我认为)更容易调试......但需要更多的写作!

大卫。

于 2012-06-01T09:03:53.817 回答