SELECT * FROM table1
WHERE Year(dateColumn) = 2015;
只要{1}位于table1中,这对我有用。但是,我在master_table中有该列。所以我在努力:
dateColumn
我也尝试过:
SELECT * FROM table1
WHERE Year(SELECT dateColumnName FROM master_table mt WHERE mt.table_id = table1.id) = 2015;
我的master_table是一个表列表,SELECT * FROM table1
WHERE Year(dateColumnName FROM master_table mt WHERE mt.table_id = table1.id) = 2015;
字段有文字字符串值dateColumnName
,我将在table1中使用它。原因是我必须通过这种方式,有些表的列名为dateColumn
,有些表有dateColumn
,所有表都存储在master_table中。
总结:我希望第二个date_column
语句返回SELECT
或dateColumn
,具体取决于主表中的值并取决于WHERE条件,并将其用于我的第一个date_column
声明。
示例数据:
表1
SELECT
id
Name
Email
dateColumn
1
John
abc@xyz.co
表2
2013-01-15
id
Name
Email
date_column
2
Paul
def@xyz.co
master_table
2014-03-05
table_id
dateColumnName
1
dateColumn
2
我需要根据日期过滤table1和table2中的数据,为此我需要列名。这些列名存储在master_table中,因此我通过匹配存储在master_table中的table_id来匹配它们的id,并使用第二个date_column
语句检索列名
答案 0 :(得分:0)
您没有子查询,您的参数以select
开头。括号用于函数,而不是子查询。
子查询的语法将包含额外的括号:
SELECT *
FROM table1
WHERE Year( (SELECT dateColumnName FROM master_table mt WHERE condition) ) = 2015;
更自然的方法是使用exists
或简单的相等:
SELECT *
FROM table1
WHERE 2015 = (SELECT YEAR(dateColumnName) FROM master_table mt WHERE condition);
请注意,这不需要额外的括号,因为没有功能。
答案 1 :(得分:0)
您真正想要的是一个JOIN查询:
select id, datefld, email from
(
select
mt.table_id as id,
case mt.dateColumnName
when 'dateColumn' then t1.`name`
when 'date_column' then t2.`name`
end as name,
case mt.dateColumnName
when 'dateColumn' then t1.dateColumn
when 'date_column' then t2.date_column
end as datefld,
case mt.dateColumnName
when 'dateColumn' then t1.email
when 'date_column' then t2.email
end as email
from
master_table mt
left join
table1 t1 on t1.id=mt.table_id
left join
table2 t2 on t2.id=mt.table_id
) a
where Year(a.datefld)=2014
我更新了SQL,并在http://sqlfiddle.com/#!9/9b9ce/1
为它做了一个sqlfiddler