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

时间:2015-09-01 16:04:30

标签: php mysql

我需要将一些大表组合成一个非常大的表,以形成统计包的单页数据导出。

使用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

这有什么办法吗?我实际上并不介意列名是什么,只要我有数据,所以如果我可以将表名添加到每个字段,那就行了。

3 个答案:

答案 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列。