你如何避免列名冲突?

min*_*gos 5 mysql sql conflict

我最近被分配了创建拍卖系统的任务.在我的工作中,我遇到了很多场合,由于列名不明确,我的包含连接的SQL查询无法执行.考虑拍卖的这个(简化的)表格结构:

auction:

  • id
  • name
  • uid (创建拍卖的用户的ID)

item:

  • id
  • name
  • uid (添加项目的用户的ID)
  • aid (项目可用的拍卖的ID)
  • price (初始价格)

user:

  • id
  • name

bid:

  • id
  • uid (出价用户的ID)
  • iid (价格已经提高的商品)
  • price (报价)

如您所见,有许多列具有冲突的名称.加入这些表需要使用一些可以消除歧义的措施.

我可以想到两种方法来做到这一点.首先是重命名列,为所有列添加一个缩写的表名称,这样拍卖ID就会变为a_id,项目ID将变为i_id,并且bid表格中的项目ID 将变为b_i_id.这非常可靠,但会降低列名的可读性.

我能想到的另一种方法是编写显式查询:

SELECT `bid`.`id`, `user`.`name`, `bid`.`price`
FROM `bid`
JOIN `item` ON `item`.`id` = `bid`.`iid`
JOIN `user` ON `user`.`id` = `bid`.`uid`
JOIN `auction` ON `auction`.`id` = `item`.`aid`
WHERE `bid`.`price` > `item`.`price`
AND `auction`.`id` = 1
GROUP BY `user`.`id`
ORDER BY `bid`.`price` DESC;
Run Code Online (Sandbox Code Playgroud)

这是可读且明确的,但需要大量额外的击键.

我使用第二种方法,但也许还有其他方法在类似情况下成功使用过?如何避免SQL查询中的列名冲突?

Mul*_*lki 12

可能你可以尝试在表名上使用别名吗?

select * from table1 as T1
join table2 as t2 on (t1.key=t2.foreignkey)
Run Code Online (Sandbox Code Playgroud)


Sar*_*raz 5

您需要使用AS别名.

您可以使用别名为表或列指定其他名称.如果您有非常长或复杂的表名或列名,这可能是一件好事.

别名可以是任何名称,但通常很短.

  • @Frank Heikens:我知道但是使用那个关键字是很好的做法:) (3认同)

And*_*rin 5

您的方法是正确的,但您也可以为表提供别名:

SELECT a.* FROM TableA A
Run Code Online (Sandbox Code Playgroud)

在这里,您可以将TableA简称为A。


Ren*_*ger 2

我的经验是,从长远来看,额外击键的好处远远超过了键入它们所需的短时间,最晚当您需要查看大约一年前编写的查询时。