2012-06-01 43 views
0

我想要做的是將三個單獨的表查詢到由唯一引用標識的一行中。我並不完全瞭解Join條款,因爲它似乎需要來自每個表的某種相關數據。Mysql查詢爲現有行檢查3個表

我知道我可以走很長一段路,但不能失去一點效率。任何幫助將不勝感激。

表結構

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

每個表具有基本上相同的結構。我只需要知道如何查詢所有三行,即1行。

+4

把表結構作爲參考..與它一起,你怎麼能建議你什麼? –

+1

http://www.whathaveyoutried.com – pduersteler

+0

我試過很多東西,主要是使用'Join',但是我的知識是有限的。看起來他們都需要相關數據,但沒有任何數據有任何關係。 – scottevans93

回答

0

比方說,你有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與實際的查詢

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像這,假設所有三個表具有相同的唯一列。

+0

如果參考值只能在表2中找到一行查找行? –

+0

對不起,沒有意識到這是一個條件。使用INNER JOIN(JOIN)這應該完成。如果只有table2具有該值,則不會返回任何內容。所有的表必須符合條件 – Rawkode

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

你可能會與其他列擴展選擇列表,只要它們具有相同的數據類型,或者是隱式轉換爲數據類型從第一選擇。

0

完全可以使用where子句在表之間創建聯接。事實上,這通常是我所做的,因爲我發現它會導致更清楚地知道您實際正在做什麼,如果您沒有得到結果,您希望可以一​​點一點地進行調試。

不過說一個連接肯定會寫得更快!

請記住,我是一個生鏽的SQL,所以我可能會錯過記住,我不會包含任何代碼,因爲你沒有說過你使用的DBMS,因爲它們都有些微的不同碼。

需要記住的一點是,聯接功能在一列上具有相同的數據(和類型)。

這是容易得多,如果每個表中有「加入」字段名稱相同,那麼它應該是

join on <nameOfField> 

不過的事情,如果你想使用在不同的表,在不同的名稱場您將需要列出完全限定的名稱。即tableName.FieldName

如果您遇到自然,內部和外部,左側和右側的問題,您需要考慮一個維恩圖,其中自然是表之間的共同點。如果僅使用兩個表,內部和外部相當於左側和右側(每個表在維恩圖中爲單個圓),左側和右側是選擇主要部分中列表中的表的順序(第一個是左邊,第二個是右邊)。

當您添加第三個表格時,您可以在其中使用這些關鍵字選擇任何交叉部分。然而,我總是發現做一個主要選擇並創建一個臨時表更容易,然後使用這個臨時表執行我的下一個聯接(因此只需要使用自然或左右再次)。我再次發現這更容易調試。

最好的事情是試驗,看看你得到的回報。沒有你的桌子的圖表,這是我能提供的最好的。

在短暫

...

嵌套選擇其中場=(從表中選擇其中場=)

和臨時表

是(我認爲)更容易調試......但做採取更多的寫作!

David。

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 
} 
+0

但就像我說的,我想避開多個查詢。 – scottevans93