min*_*gos 5 mysql sql conflict
我最近被分配了创建拍卖系统的任务.在我的工作中,我遇到了很多场合,由于列名不明确,我的包含连接的SQL查询无法执行.考虑拍卖的这个(简化的)表格结构:
表auction:
idnameuid (创建拍卖的用户的ID)表item:
idnameuid (添加项目的用户的ID)aid (项目可用的拍卖的ID)price (初始价格)表user:
idname表bid:
iduid (出价用户的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)
您可以使用别名为表或列指定其他名称.如果您有非常长或复杂的表名或列名,这可能是一件好事.
别名可以是任何名称,但通常很短.
您的方法是正确的,但您也可以为表提供别名:
SELECT a.* FROM TableA A
Run Code Online (Sandbox Code Playgroud)
在这里,您可以将TableA简称为A。