我想要做的是將三個單獨的表查詢到由唯一引用標識的一行中。我並不完全瞭解Join
條款,因爲它似乎需要來自每個表的某種相關數據。Mysql查詢爲現有行檢查3個表
我知道我可以走很長一段路,但不能失去一點效率。任何幫助將不勝感激。
表結構
package_id int(8),
client_id int(8),
unique reference varchar (40)
每個表具有基本上相同的結構。我只需要知道如何查詢所有三行,即1行。
我想要做的是將三個單獨的表查詢到由唯一引用標識的一行中。我並不完全瞭解Join
條款,因爲它似乎需要來自每個表的某種相關數據。Mysql查詢爲現有行檢查3個表
我知道我可以走很長一段路,但不能失去一點效率。任何幫助將不勝感激。
表結構
package_id int(8),
client_id int(8),
unique reference varchar (40)
每個表具有基本上相同的結構。我只需要知道如何查詢所有三行,即1行。
比方說,你有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 = '?';
你可以使用JOIN像這,假設所有三個表具有相同的唯一列。
如果參考值只能在表2中找到一行查找行? –
對不起,沒有意識到這是一個條件。使用INNER JOIN(JOIN)這應該完成。如果只有table2具有該值,則不會返回任何內容。所有的表必須符合條件 – Rawkode
如果您有幾個表共享相同或相似的定義,則可以使用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 = ?
你可能會與其他列擴展選擇列表,只要它們具有相同的數據類型,或者是隱式轉換爲數據類型從第一選擇。
完全可以使用where子句在表之間創建聯接。事實上,這通常是我所做的,因爲我發現它會導致更清楚地知道您實際正在做什麼,如果您沒有得到結果,您希望可以一點一點地進行調試。
不過說一個連接肯定會寫得更快!
請記住,我是一個生鏽的SQL,所以我可能會錯過記住,我不會包含任何代碼,因爲你沒有說過你使用的DBMS,因爲它們都有些微的不同碼。
需要記住的一點是,聯接功能在一列上具有相同的數據(和類型)。
這是容易得多,如果每個表中有「加入」字段名稱相同,那麼它應該是
join on <nameOfField>
不過的事情,如果你想使用在不同的表,在不同的名稱場您將需要列出完全限定的名稱。即tableName.FieldName
如果您遇到自然,內部和外部,左側和右側的問題,您需要考慮一個維恩圖,其中自然是表之間的共同點。如果僅使用兩個表,內部和外部相當於左側和右側(每個表在維恩圖中爲單個圓),左側和右側是選擇主要部分中列表中的表的順序(第一個是左邊,第二個是右邊)。
當您添加第三個表格時,您可以在其中使用這些關鍵字選擇任何交叉部分。然而,我總是發現做一個主要選擇並創建一個臨時表更容易,然後使用這個臨時表執行我的下一個聯接(因此只需要使用自然或左右再次)。我再次發現這更容易調試。
最好的事情是試驗,看看你得到的回報。沒有你的桌子的圖表,這是我能提供的最好的。
在短暫...
嵌套選擇其中場=(從表中選擇其中場=)
和臨時表
是(我認爲)更容易調試......但做採取更多的寫作!
David。
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
}
但就像我說的,我想避開多個查詢。 – scottevans93
把表結構作爲參考..與它一起,你怎麼能建議你什麼? –
http://www.whathaveyoutried.com – pduersteler
我試過很多東西,主要是使用'Join',但是我的知識是有限的。看起來他們都需要相關數據,但沒有任何數據有任何關係。 – scottevans93