[英]mySQL select query, get data from multiple tables
我正在嘗試從mySql DB
獲取數據。 總共有9個表,我必須從所有表中相應地顯示產品列表。
我想到了使用JOIN,並嘗試了LEFT JOIN,如下所示:
$query="SELECT table1.*,tbl2.*,tbl3.*,tbl4.*,tbl5.*,tbl6.*,tbl7.*",tbl8.*,tbl9.* FROM
table1
LEFT JOIN tbl2 ON table1.pid=tbl2.pid
LEFT JOIN tbl3 ON table1.pid=tbl3.pid
LEFT JOIN tbl3 ON table1.pid=tbl4.pid ... and so on upto tbl9 GROUP BY table1.pid";
在這里, Table1
是主表,而pid是從tbl2到tbl9的所有表的FK
。
注意:在這里,我在所有表上使用.*
以避免長時間查詢,但是在實際的數據庫操作中,僅提及特定的列以提高性能。
現在實際的問題是我沒有使用LEFT JOIN從表中獲取所有記錄。
table1
對應的每個條目僅檢索最后一行。
數據示例。
假設table1
有一個ID為2
產品,那么在tbl2,tbl3中有多個條目,依此類推,以id 2
為參考。
我如何也可以從其他表中獲取所有數據而又沒有重復的行。
表結構
table1
id | name | lastName
---------------------------------------
1 | john | doe
2 | helen | keller
table2
The userID column is a foreign key that references John Doe, so John orders 3 items.
id | userID | order
---------------------------------------
1 | 1 | pizza
2 | 1 | pasta
3 | 1 | lasagna
Table3
userID列是引用John Doe的外鍵,因此John留下5條評論。
id | userID | rating | comment
-------------------------------------------------
1 | 1 | 5/5 | was good
2 | 1 | 5/5 | excellent
3 | 1 | 4/5 | great
4 | 1 | 4/5 | great
5 | 1 | 4/5 | great
表結構是從這里復制的,因為它與我的相同。
結果如下:
id name lastname order order1 order2 MoreDetails
-------------------------------------------------
1 John doe pizza pasta lasgana click to view
現在,當用戶單擊視圖時,將顯示一個彈出窗口,其中包含表3中的所有數據。
此處不需要數據透視表,因為數據表示形式有所不同。
您需要一個可能包含無限列的數據透視表,以及某種加載相關數據的用戶界面/交互。 這不是SQL數據庫的工作方式。
我最接近您的要求的是:
SELECT table1.*, GROUP_CONCAT(table2.order) AS orders, 'click to view' AS MoreDetails
FROM table1
LEFT JOIN table2 ON table1.id = table2.userID
GROUP BY table1.id
這會將訂單合並到一個用逗號分隔的列表中,該列表稱為orders
,而“ click to view”只是一個字符串。 可以使用PHP處理用戶交互,您可以接收用戶單擊的ID,然后運行新查詢以檢索相關信息:
SELECT * FROM table3 WHERE userID = $id
數據庫: PostgreSQL
嘗試這個:
SELECT t1.id, t1.name, t1.lastname, (array_agg(t2.order))[1] as order,
(array_agg(t2.order))[2] as order1, (array_agg(t2.order))[3] as order2,
'Clicks to view' as "Moredetails"
FROM table1 as t1
LEFT JOIN table2 as t2 ON t1.id = t2."userID"
LEFT JOIN table3 as t3 ON t1.id = t3."userID"
WHERE t1.id = 1
GROUP BY 1,2,3
輸出:
id name lastname order order1 order2 MoreDetails
-------------------------------------------------
1 John doe pizza pasta lasgana click to view
不確定要獲得什么結果。 考慮到您希望至少獲取一次每個表上這些條目的產品信息,那么您需要對這些出現進行合並,將它們分組(以避免重復)在子查詢中並顯示每個出現的詳細信息找到產品。
SELECT table1.* FROM table1 inner join (
SELECT pid FROM tbl2 WHERE your_filter = ?
UNION
SELECT pid FROM tbl3 WHERE your_filter = ?
UNION
SELECT pid FROM tbl4 WHERE your_filter = ?
UNION
...
GROUP BY pid) as subqueryIds
on table1.pid = subqueryIds.pid
如果不需要對每個表進行任何類型的過濾,則可以完全禁止WHERE
。
不知道這是您在尋找什么。 希望它能有所幫助。
嘗試根據像這樣的關系聯接表
SELECT table1.*,tbl2.*,tbl3.*,tbl4.*,tbl5.*,tbl6.*,tbl7.*,tbl8.*,tbl9.* FROM
table1
LEFT JOIN tbl2 ON table1.pid=tbl2.pid
LEFT JOIN tbl3 ON table2.pid=tbl3.pid
等等...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.