Php SQL:命令创建虚拟行(如果不存在)
在MySQL中,如果数据不存在,是否可以创建新的虚拟行,具体取决于用户条件Php SQL:命令创建虚拟行(如果不存在),php,mysql,sql,Php,Mysql,Sql,在MySQL中,如果数据不存在,是否可以创建新的虚拟行,具体取决于用户条件 我的查询如下所示: SELECT year, value, type FROM myTable WHERE year BETWEEN ( '2010' AND '2013') AND type IN ('Oil', 'Gas'); 输出: year | value | type --------------------- 2013 | 0 | Oil 2012 | 144.5 |
我的查询如下所示:
SELECT year, value, type FROM myTable
WHERE year BETWEEN ( '2010' AND '2013') AND type IN ('Oil', 'Gas');
输出:
year | value | type
---------------------
2013 | 0 | Oil
2012 | 144.5 | Oil
2012 | 434.3 | Gas
2011 | 141.0 | Oil
2011 | 1234 | Gas
2010 | 4567 | Gas
---------------------
我想运行一个查询,该查询将输出如下记录:
year | value | type
---------------------
2013 | 0 | Oil
2013 | 0 | Gas // -> new virtual* row
2012 | 144.5 | Oil
2012 | 434.3 | Gas
2011 | 141.0 | Oil
2011 | 1234 | Gas
2010 | 4567 | Gas
2010 | 0 | Oil // -> new virtual* row
---------------------
用户希望同时显示“天然气”和“石油”,但由于2013年仅包含“石油”类型,因此我希望为“天然气”创建一个新的记录,该记录的值为0,而“2010年”的值相同(基于上述所需输出)
编辑:
如您所述,您实际上有两张桌子。 我不希望用这些0值污染数据库,但如果您坚持的话
INSERT INTO data
SELECT
cross_join.year as year,
0 as value,
cross_join.id as type_id
FROM data
RIGHT JOIN (
SELECT types.id, year
FROM types
JOIN (SELECT DISTINCT year FROM data) distinct_years
) cross_join ON (cross_join.id = data.type_id AND cross_join.year = data.year)
WHERE data.year IS NULL
另一种方法是在查询过程中虚拟地添加这些行,我更喜欢这样
SELECT
COALESCE(data.year, cross_join.year) as year,
COALESCE(data.value, 0) as value,
COALESCE(data.type_id, cross_join.id) as type_id
FROM data
RIGHT JOIN (
SELECT types.id, year
FROM types
JOIN (SELECT DISTINCT year FROM data) distinct_years
) cross_join ON (cross_join.id = data.type_id AND cross_join.year = data.year);
您可以轻松地在客户端(php)提供此视图,那么为什么要搜索这种类型的查询?因为类型只有石油和天然气?“类型”也是动态的,它可以包含“煤炭”、“电力”等任何内容。这取决于用户输入。(事实上,我有两个表,一个用于值,另一个用于类型名)。你能把表定义(DDL)放进去吗?格雷西亚斯!第二个查询是我要找的,对不起,如果我没有说清楚(在我的问题上),我也更喜欢虚拟行。干杯
SELECT
COALESCE(data.year, cross_join.year) as year,
COALESCE(data.value, 0) as value,
COALESCE(data.type_id, cross_join.id) as type_id
FROM data
RIGHT JOIN (
SELECT types.id, year
FROM types
JOIN (SELECT DISTINCT year FROM data) distinct_years
) cross_join ON (cross_join.id = data.type_id AND cross_join.year = data.year);