我最近被分配了创建拍卖系统的任务。在我的工作中,我遇到过很多场合,包含连接的SQL查询由于列名不明确而无法执行。考虑这个(简化的)表结构的拍卖:如何避免列名冲突?
表auction
:
id
name
uid
表(创建该拍卖的用户的ID) item
:
id
name
uid
aid
price
(初始价格)(其中项目是可用的拍卖的ID)
表user
:
id
name
表bid
:
id
uid
iid
(项,它的价格已经提出)(即放置在出价的用户的ID)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;
这是可读的和明确的,但需要大量额外的按键。
我使用第二种方法,但也许有其他人,你已经成功地用于类似的情况?你如何避免SQL查询中的列名冲突?
如果'keystrokes'是当你程序,你需要重新考虑你的职业生涯路径的关注! – RichardTheKiwi 2011-02-23 11:57:46
@Richard:好的,你让我用这个,这句话值得+1 :) – mingos 2011-02-23 12:10:32
放下反引号',这些与SQL无关(检查标准!)并保存一些击键。 – 2011-02-23 14:19:58