Mysql Query检查现有行的3个表

时间:2012-06-01 08:38:44

标签: php mysql sql

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

我知道我可以在很长一段时间内解决这个问题,但不能失去一点效率。任何帮助将不胜感激。

表格结构

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

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

5 个答案:

答案 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
}