2012-02-13 13 views
0

我使用的MySQL 5.1如何使用列名作为变量在我的SELECT语句中创建新列?

这里就是我想要做的事:

SELECT name, gender, age, partners.rate_M, partners.rate_F 
    FROM users INNER JOIN partners ON users.id = partners.M_id 

目前我有什么是:

SELECT name, gender, age, partners.rate_M, partners.rate_F 
    FROM users INNER JOIN partners 
    ON (users.id = partners.M_id OR users.id = partners.F_id) 

减慢我的系统。

M_id中的M是性别,那么如何让M动态?

users.gender + '_id' = M_id or F_id 
+0

被选定列来自合作伙伴的表? – 2012-02-13 04:18:41

+0

users.id是用户表的pk,partners.M_id和partners.F_id是FK引用users.id,伙伴(rowid,f_id,m_id,rate_m,rate_f,s​​core_m,score_f ...更多) – 2012-02-13 04:29:28

+0

它几乎总是有利于显示表格的大纲模式。直接相关的列,主键和表格之间的任何PK/FK关系是最感兴趣的。合作伙伴表似乎包含列(M_id,F_id,Rate_M,Rate_F,...);没有给出PK,但可能是(M_id,F_id)的组合。 Users表似乎包含列(Id,Name,Gender,Age,...); Id可能是PK。从Partners.M_id到Users.Id有一个FK,而另一个从Partners.F_id到Users.Id。这是对的吗? (我总是怀疑'年龄'栏目。) – 2012-02-13 04:32:20

回答

0

你不能直接这样做,所以你必须使用间接机制。

一个简单的选择是一个UNION:

SELECT u.name, u.gender, u.age, p.rate_M, p.rate_F 
    FROM users AS u INNER JOIN partners AS p ON u.id = p.M_id AND u.gender = 'M' 
UNION 
SELECT u.name, u.gender, u.age, p.rate_M, p.rate_F 
    FROM users AS u INNER JOIN partners AS p ON u.id = p.F_id AND u.gender = 'F'; 
+0

谢谢,这应该做 – 2012-02-13 04:49:30

+0

其实,想想看,如果Users.Id值是唯一的,你不需要'AND性别='F'' (或“M”)过滤条件;一个给定的用户只会出现在“Partners.M_id”或“Partners.F_id”列中。如果优化器非常聪明(但我怀疑它可能不是 - 在任何商业DBMS或开放源代码,如MySQL或PostgreSQL中),如果没有筛选器,它甚至可能会更快。 – 2012-02-13 04:54:53

相关问题