簡體   English   中英

mySQL INNER JOIN具有相同列名的超大表

[英]mySQL INNER JOIN very large tables with same column names

我有一些大表,需要將它們組合成一個非常大的表,以形成用於統計軟件包的單頁數據導出。

使用INNER JOIN可以輕松實現,但是某些表具有相同的列名,而當我在PHP中將它們作為數組獲取時,它們會被彼此覆蓋。

有4個表,每個表有30-200列,因此字段名稱太多,無法手動在帶有別名的查詢中包括,在這種情況下會很常見。

這是查詢:

SELECT * FROM logs 
    INNER JOIN logdetail ON logdetail.logID = logs.id
    INNER JOIN clients ON clients.id = logs.clientID
    INNER JOIN records ON records.id = logdetail.id
    WHERE logs.userID=1

有沒有辦法解決? 我實際上不介意列名是什么,只要有數據即可,因此,如果可以將表名放在每個字段的前面,就可以解決問題。

我將創建一個視圖,您的視圖將包含帶有別名的長查詢

這是手冊中的一個例子

mysql> CREATE TABLE t (qty INT, price INT);
mysql> INSERT INTO t VALUES(3, 50);
mysql> CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;
mysql> SELECT * FROM v;
+------+-------+-------+
| qty  | price | value |
+------+-------+-------+
|    3 |    50 |   150 |
+------+-------+-------+

這一直對我有用,除非這些表之間存在one to many或其他關系,否則它們會重復記錄。

SELECT * FROM logs l
INNER JOIN logdetail  ld ON ld.logID = l.id
INNER JOIN clients c ON c.id = l.clientID
INNER JOIN records r ON r.id = ld.id
WHERE l.userID=1

正如安德魯(Andrew)所說的那樣,您還可以使用視圖使此功能正常運行,這要涼得多。

我找到了解決方案。 簡單地說,第二次使用別名來獲取每個重復的列。 這樣,將再次選擇覆蓋的值並使用別名:

SELECT * FROM logs, 
    clients.name as clientName,
    logs.name as logName,
    etc...
INNER JOIN logdetail ON logdetail.logID = logs.id
INNER JOIN clients ON clients.id = logs.clientID
INNER JOIN records ON records.id = logdetail.id
WHERE logs.userID=1

注意:對於重復項的最終實例,無需執行此操作,因為此列不會被覆蓋。 因此,在上面的示例中,不需要包含諸如records.name as recordName類的行records.name as recordName ,因為由於其后沒有名稱相同的列,所以record.name字段從未被覆蓋過,因此在name列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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