定义列别名?

时间:2010-01-24 21:08:36

标签: sql mysql

我有这样的查询:

SELECT `*` 
  FROM (`threads` t, `members` m) 
 WHERE `m`.`id` = t.author 
   AND `t`.`type` = '0' 
   AND `t`.`category` = '1'

基本上发生的事情是两个表(成员和线程)中都有一个ID字段,所以发生的事情是结果数组搞砸了。 IE:只有一个ID字段从成员表中填充。

我需要做的是使用其键名前面的结果来生成结果,以便我可以区分这两者: IE:加't。'到所有线程字段和'm。'到所有成员领域。

所以结果应该是:m.id = x,t.id = y 相反,此刻的结果如下:id = x(线程表中的id字段被成员表中的id字段完全覆盖)

4 个答案:

答案 0 :(得分:2)

您可以通过逐个命名每个列来实现:

SELECT m.`id` AS "m_id", `t`.`id` AS "t_id", t.`username` AS "t_username"
FROM (`threads` t, `members` m) 
WHERE `m`.`id` = t.author 
   AND `t`.`type` = '0' 
   AND `t`.`category` = '1'

答案 1 :(得分:1)

使用:

SELECT m.id AS x,
       t.id 'y' 
  FROM MEMBERS m
  JOIN THREADS t ON t.id = m.author
                AND t.type = '0'
                AND t.category = '1'

列别名是逐列定义的 - 您不能使用通配符/ etc 您可以使用AS关键字,或者只是将列别名括在单引号中,如果列名称不包含特殊字符 - 如果是,则使用双引号。您可以将单/双引号用法与AS关键字结合使用。

我是否必须列出所有列?


是的,您必须列出所有列,除非您喜欢重复列,因为您选择使用m.*t.*。 SQL中没有支持您要求的约定。 SELECT * is not an ideal practice - read this answer for details beyond this situation why

附录


我冒昧地重写您的查询以使用ANSI-92 JOIN语法 - 您的示例使用ANSI-89。没有性能差异。

答案 2 :(得分:0)

您可以为具有相同名称的列设置别名:

SELECT t.ID as threadsID, m.ID as membersID, <...> WHERE `m`.`id` = t.author AND `t`.`type` = '0' AND `t`.`category` = '1'

答案 3 :(得分:0)

如果你只想让id分开,你可以做

SELECT `*`, t.id as t_id, m.id as m_id
  FROM (`threads` t, `members` m) 
WHERE `m`.`id` = t.author 
  AND `t`.`type` = '0' 
  AND `t`.`category` = '1'

正如其他人所说,这是一个列别名。