我最近被分配了创建拍卖系统的任务。在我的工作中,我遇到了很多场合,由于列名不明确,我的包含连接的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;
这是可读且明确的,但需要大量额外的击键。
我使用的是第二种方法,但也许还有其他方法在类似情况下成功使用过?如何避免SQL查询中的列名冲突?
答案 0 :(得分:12)
您可以尝试在表名上使用aliases吗?
select * from table1 as T1
join table2 as t2 on (t1.key=t2.foreignkey)
答案 1 :(得分:5)
答案 2 :(得分:4)
您的方法是正确的,但您也可以为您的表格提供别名:
SELECT a.* FROM TableA A
在这里你可以简单地将TableA称为A.
答案 3 :(得分:3)
我的经验是,额外击键的好处超过了从远处开始到目前为止所需的短时间,最迟需要时看一下你一年前写的一个查询。
答案 4 :(得分:2)
经验法则是,如果您使用多个表,请对表进行别名,并明确地为所有列设置别名。
这种一致性将让你深入到力量,年轻的padawan。
答案 5 :(得分:2)
更改您的命名约定,以便每个数据元素在架构中具有唯一的名称,例如auction_id
,bid_id
,user_id
等。理想情况下,数据元素的名称在表格之间不会更改,但有时您需要添加限定符来创建同义词,例如adding_user_id
和bidding_user_id
如果user_id
在同一张表中出现两次。您应该在数据字典中记录数据元素名称及其同义词。
答案 6 :(得分:0)
您还可以在表名旁边定义表格列:
SELECT P.*,T.name AS type FROM <TABLE-A> AS P LEFT JOIN <TABLE-B> AS T ON P.id=T.id
答案 7 :(得分:0)
我遇到了MySQLSyntaxErrorException
:
您的SQL语法有误;检查手册 对应于您使用正确语法的MySQL服务器版本 在'rank
附近
执行以下查询后:
插入my_table(排名)值(1);
因为rank
列名与sql关键字rank
冲突。
解决方案:
我已经在rank
列名称中添加了 反引号 ,问题已解决:
插入my_table(`rank`)值(1);
解决问题的另一种方法是使用 表名 代替 反引号 :
插入my_table(my_table.rank)值(1);