如何插入表并覆盖如果不为空?

时间:2017-02-17 07:52:39

标签: php mysql

我想知道如何制作这段代码:如果不是空插入表,否则覆盖行:

$affectedRows = $pdo->exec( 
    "insert into table_1 (name, money, month, year)
    select name, count(*), MONTH(STR_TO_DATE(data, '%d/%m/%Y')),  
    YEAR(STR_TO_DATE(data, '%d/%m/%Y'))
    from table_2
    group by name");

由于

1 个答案:

答案 0 :(得分:0)

使用以下查询:

INSERT INTO table_1 (name, money, month, year)
SELECT t.name, t.money, t.month, t.year
FROM
(
    SELECT name,
           COUNT(*) AS money
           MAX(MONTH(STR_TO_DATE(data, '%d/%m/%Y'))) AS month,
           MAX(YEAR(STR_TO_DATE(data, '%d/%m/%Y')))  AS year
    FROM table_2
    GROUP BY name
) t
ON DUPLICATE KEY UPDATE name=t.name, money=t.money, month=t.month, year=t.year

请注意,我将MONTH()YEAR()的调用与MAX()(一个聚合函数)包装在一起,因为在使用GROUP BY时选择非聚合列是不正确的。如果您向我们展示table_2的实际数据,那么可能会对此进行改进。

<强>更新

请注意,其结果集用于上面插入的子查询永远不会生成重复记录,因为每个组只能有一条记录。因此,为了测试这个答案,您必须在table_1中有一些数据可以被子查询复制。