我正在尝试使用这样的 sql:
SELECT t.*, t2.* FROM templates t
LEFT JOIN IF(t.t_type = 0,'templates_email',
IF(t.t_type = 1,'templates_sms','templates_fax')) t2
ON t.t_id = t2.t_id;
有没有可能做这样的事情?
基本上我想根据行中的值加入三个表中的一个。
如果可能,是否推荐这样做?
更新
所以,
基本上 templates
表是包含每个模板必须具有的所有信息的表,例如名称、id、描述
然后您就有了 templates_x
表,这些表包含每个模板类型所特有的字段。
(有很多,对于那些不适用的字段,使用一个包含空字段的表是不切实际的)。
这些表称为 templates_x
,但是适当的 x 作为 int 标志存储在模板表中。
templates_x
表和 templates
表之间的连接是通过 t_id
实现的。
那你有什么建议呢?
最佳答案
有没有可能做这样的事情?
不,如果不使用动态 SQL 语法(参见 MySQL's PreparedStatement syntax),您不能使用动态分配的表(连接或其他方式)。
您的伪查询的这种非动态重写假设您加入的三个模板表都具有相同的列数和相同的数据类型:
SELECT t.*,
te.*
FROM TEMPLATES t
JOIN TEMPLATES_EMAIL te ON te.t_id = t.t_id
WHERE t.t_type = 0
UNION
SELECT t.*,
ts.*
FROM TEMPLATES t
JOIN TEMPLATES_SMS ts ON ts.t_id = t.t_id
WHERE t.t_type = 1
UNION
SELECT t.*,
tf.*
FROM TEMPLATES t
JOIN TEMPLATES_FAX tf ON tf.t_id = t.t_id
WHERE t.t_type NOT IN (0, 1)
关于sql - mysql 在 IF() 上加入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3808689/