Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL:命令创建虚拟行(如果不存在)_Php_Mysql_Sql - Fatal编程技术网

Php SQL:命令创建虚拟行(如果不存在)

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 |

在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 | 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);