2012-10-31 117 views
6

范例table:Mysql的前缀自动添加到域

id | field1 | field2 
-------------------- 

表2:

id | id1 | field1 | field2 
-------------------------- 

是否有可能做到这一点:

select t1.*, t2.* from table1 t1 inner join table2 t2 on t1.id = t2.id1 

和接受这样的结果:

t1_id | t1_fiedl1 | t1_field2 | t2_id | t2_id1 | t2_fiedl1 | t2_field2 
---------------------------------------------------------------------- 

我们的目标是使MySQL自动添加前缀导致领域,避免长时间分型,如

select t1.id as t1_id, t1.field1 as t1_field1 

+1

你试过了吗? – hims056

+0

您可以得到标题,我不确定数据,请提供示例数据并说明您的期望 –

+0

我总是在字段名称的前面加上所有表格的表名称的描述性三字缩写。 –

回答

4

的SQL引擎将不会重写查询,为您“自动别名”场 - 别名必须是明确的。

但是,您在客户端代码中有两个选项。首先,你明显可以编写一个抽象概念,将查询拼凑在一起,并在此过程中提供别名。

其次,更简单的是,正在使用与每个结果集关联的底层MYSQL_FIELD结构中公开的信息。它们包含有关每个字段的字段和表名(以及其他信息),允许您以编程方式将t1_field1缝合在一起,并且无需事先知道字段名称。此信息如何公开取决于您的特定客户端API。

+1

一些示例代码会很好。 – petermeissner

-1
select t1.id as t1_id, t1.fiedl1 as t1_fiedl1 , 
    t1.field2 as t1_field2 ,t2.id as t2_id , 
    ,t2.fiedl1 as t2_fiedl1 ,t2.field2 as t2_field2 
    from table1 t1 left outer join table2 t2 on t1.id = t2.id1 
+0

问题的关键在于能够匿名选择所有的字段,并且仍然有前缀。 –

+0

试试这个更新的解决方案 – jainvikram444

2

我们的目标是使MySQL自动添加前缀以避免长时间打字,如

select t1.id as t1_id, t1.field1 as t1_field1 and so on

如果两个表中的字段名相同,则不会从两个表中获取列。
您必须编写具有特定别名的列名才能实现。

例如,

SELECT t1.id t1_id, t1.field1 t1_fiedl1, t1.field2 t1_field2 
     ,t2.id t2_id, t2.id1 t2_id1 ,t2.field1 t2_fiedl1, t2.field2 t2_field2 
FROM table1 t1 
INNER JOIN table2 t2 
     ON t1.id = t2.id1 

See this SQLFiddle Demo

如果在两个表中的字段名称不同,那么你可以做,以达到预期的效果。

例如,

SELECT  t1.*, t2.* 
FROM  table1 t1 
INNER JOIN table2 t2 
     ON t1.id = t2.id1; 

See this SQLFiddle

+1

我知道。但它真的很烦人,特别是当我在有20个以上字段的表上操作3个或更多的连接时。而且,我应该如何考虑在每个表格中使用的“name”字段?这就是我问的原因。也许有更灵活的解决方案。 – abr

+0

引擎总是返回投影中的* all *字段。但是,基于默认的非限定列名获取行的客户端API不会看到具有相同“名称”的多个字段。 SQLFiddle出现使用这样一个API,这就是为什么它在你查询时不能区分'id'和'id',但是命令行'mysql(1)'客户端可以。 – pilcrow

0

不,mysql不会在自动加上的前缀。您要做的唯一事情就是在列周围手动添加alias。如果你不想这样做,那么最好的办法是重新命名你的列,从每个表中取得唯一的名字。如果您不添加alias,并且列的名称相同,则倾向于显示第一个表中的列。这是正常的,因为表之间的名称冲突。