2011-03-28 56 views
4

假設我有一個具有以下結構的表'stats':tableName | id |瀏覽量。 tableName列對應於數據庫中的單獨表。MySQL基於列值的內聯表

當針對「統計信息」運行查詢時,針對tableName列結果進行內部聯接以獲取每個表的數據的最佳方法是什麼?我正在考慮在foreach中運行動態選擇,然後合併結果。例如:

foreach($tableNames as $tableName) { 
    $sql = "SELECT * 
       FROM stats s 
     INNER JOIN $tableName tbl ON s.id = tbl.id 
      WHERE tableName = '$tableName'"; 
} 
+0

你說:* tableName列對應於數據庫中的單獨表* *。 「id」對應什麼?我是否正確理解此統計表中有關於每個表的每一行的統計信息?因此,統計信息中的每一行都將「pageViews」存儲在表「tableName」中的「id」中? – 2011-03-28 06:13:48

回答

7

要讓所有表的統計數據,你可以使用UNION,有2個或更多的選擇,一個爲每個表:

(SELECT s.* 
     , table1.title AS name  --or whatever field you want to show 
    FROM stats s 
    JOIN $tableName1 table1 
     ON s.id = table1.id 
    WHERE tableName = '$tableName1' 
) 
UNION ALL 
(SELECT s.* 
     , table2.name AS name  --or whatever field you want to show 
    FROM stats s 
    JOIN $tableName2 table2 
     ON s.id = table2.id 
    WHERE tableName = '$tableName2' 
) 
UNION ALL 
(SELECT s.* 
     , table3.lastname AS name  --or whatever field you want to show 
    FROM stats s 
    JOIN $tableName3 table3 
     ON s.id = table3.id 
    WHERE tableName = '$tableName3' 
) 
; 

使用溫弗雷德的想法與LEFT JOIN秒。它產生不同的結果,例如其他表中的每個字段都會輸出到它自己的列中(並且會出現很多空值)。

SELECT s.* 
    , table1.title  --or whatever fields you want to show 
    , table2.name 
    , table3.lastname --etc 
FROM stats s 
    LEFT JOIN $tableName1 table1 
    ON s.id = table1.id 
     AND s.tableName = '$tableName1' 
    LEFT JOIN $tableName2 table2 
    ON s.id = table2.id 
     AND s.tableName = '$tableName2' 
    LEFT JOIN $tableName3 table3 
    ON s.id = table3.id 
     AND s.tableName = '$tableName3' 
--this is to ensure that omited tables statistics don't appear 
WHERE s.tablename IN 
    ('$tableName1' 
    , '$tableName2' 
    , '$tableName3' 
    ) 
; 
+0

你好。感謝您的答覆。我實際上在答覆之前最終採用了這種方法,但再次感謝保證。 – jexx2345 2011-03-28 13:28:23

+0

Thnx。實際上有一種方法可以和Winfred的想法一起使用,使用LEFT JOINs,它會產生稍微不同的結果。 – 2011-03-28 13:34:47

3

您是否有奢望先加入所有表格,然後再處理?

SELECT * 
    FROM stats s 
    LEFT OUTER JOIN tbl1 ON s.id = tbl.id 
    LEFT OUTER JOIN tbl2 ON s.id = tbl2.id 

然後你在程序中取得你需要的值?

你應該儘量減少你對數據庫的查詢次數,如果可能的話,儘量一次性完成。

否則,想想存儲過程

這是做這件事(與間接費用)的一個簡單的方法,我敢肯定,別人也會幫助你了。

+0

謝謝你的建議。我將採用左外連接的建議。所以你會說,一個含有n個連接的查詢比不使用存儲過程的多個查詢更有效率? – jexx2345 2011-03-28 02:43:47

+0

這取決於您要提取多少數據。如果您添加1個額外的列並且n相對較小,那麼這是一個可接受的解決方案。否則,您可以考慮如何使用單個查詢返回所有n行,他們在內部處理n行,或者如果表不適用於您的情況,則可以使用SP和更高級的數據結構。 – Winfred 2011-03-28 02:51:11

+0

我不認爲這個查詢會顯示正確的結果。它將關聯,例如來自id = 1的tbl1的行和具有相同(id = 1)的來自tbl2的行。 – 2011-03-28 06:20:50