最近,我被分配创建拍卖系统的任务。在我的工作中,我遇到了无数次由于列名不明确而导致包含联接的SQL查询无法执行的情况。考虑以下(简化的)拍卖表结构:
表auction:
auction
id
name
uid
表item:
item
aid
price
表user:
user
表bid:
bid
iid
如您所见,有许多列具有冲突的名称。连接这些表需要采取一些措施来消除歧义。
我可以想到两种方法来做到这一点。首先是对列进行重命名,并为所有列加上缩写的表名,以使拍卖ID变为a_id,商品ID变为i_id,bid表中的商品ID变为b_i_id。这很可靠,但是会降低列名的可读性。
a_id
i_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;
这是可读且明确的,但是需要大量的额外击键。
我使用第二种方法,但是也许您在类似情况下成功使用了其他方法?如何避免SQL查询中的列名冲突?
我的经验是,从长远来看, 额外的击键 所带来的好处远远超过了在短时间内键入它们 所 花费的时间,而最晚的时候是您需要查看一年左右左右编写的查询时。