簡體   English   中英

MySQL選擇查詢,從多個表中獲取數據

[英]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對應的每個條目僅檢索最后一行。

  • 我使用GROUP BY來避免使用LEFT JOIN重復輸入。

數據示例。

假設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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM