我需要将一些大表组合成一个非常大的表,以形成统计包的单页数据导出。
使用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
这有什么办法吗?我实际上并不介意列名是什么,只要我有数据,所以如果我可以将表名添加到每个字段,那就行了。
答案 0 :(得分:0)
我会创建一个视图,您的视图将包含您使用别名的长查询
以下是manual
的示例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 |
+------+-------+-------+
答案 1 :(得分:0)
这一直对我有用,除非你在这些表中有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
正如安德鲁所说,你也可以使用View来使这个东西工作得更酷。
答案 2 :(得分:0)
我找到了解决方案。简单地说,第二次获取每个重复列,这次使用别名。这样,再次选择覆盖的值并使用别名:
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
的行,因为由于后面没有列具有相同名称的列,因此record.name
字段从未被覆盖并且已经可用在name
列。