[英]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.