我有这样的查询:
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字段完全覆盖)
答案 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'
正如其他人所说,这是一个列别名。