【问题标题】:MySql - if there is no record, insert multiple rowsMySql - 如果没有记录,则插入多行
【发布时间】:2014-05-24 13:52:35
【问题描述】:

在问这个问题之前,我已经在 Google 和 StockOverflow 上搜索了很多条目。没有什么能满足我的问题。

有两个表 - group_sale_bonusesmembers。我想检查group_sale_bonuses中是否已经有product_id "1"的记录。

如果没有,我想将members 表中的所有记录插入group_sale_bonusesproduct_id "1"

我的总体要求如下:

IF ((Select count(id) from group_sale_bonuses where product_id = 1) = 0) THEN
    INSERT INTO group_sale_bonuses (member_id, product_id, quantity_counter, credit)  
    SELECT id, 1, 0, 0 FROM members
END IF

但是这个 sql 会导致错误。

我知道有关于Insert IgnoreWhere Not Exists的解决方案。

但是这些条件检查是基于每条记录的。我在members 表中有数千条记录。我想像上面的 sql 示例一样只进行一次条件检查。

顺便说一句,我将在Php Web 应用程序中使用这个Sql

【问题讨论】:

  • 您遇到了哪个错误?
  • @user790454 错误是 - #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'IF ((Select count(id) from group_sale_bonuses where product_id = 1) = 0) THEN' 附近使用正确的语法
  • 我不认为你可以在查询中直接使用这样的 IF 语句,至少我在谷歌上找不到任何关于此的内容。我认为你应该用你的网络应用程序来代替。我知道的唯一 if 语句是 if(condition, thenthis, elsethis)
  • 您可以使用例程,但这对您的情况不利。
  • @BenBeri 我知道我可以在我的 Web 应用程序中检查这个条件,然后,只需对数据库进行两次触摸。但我只想知道是否只有在Sql中才有解决方案。

标签: php mysql


【解决方案1】:

您可以只在WHERE 子句中设置代码,而不是IF

INSERT INTO group_sale_bonuses(
    member_id, 
    product_id,
    quantity_counter,
    credit) 
SELECT 
    id, 1, 0, 0 FROM members 
WHERE( 
    SELECT 
        count(id) FROM group_sale_bonuses
    WHERE product_id = 1
) = 0;

【讨论】:

    【解决方案2】:

    这应该适用于所有 product_id

    SELECT m.product_id, m.member_id FROM members AS m 
    LEFT JOIN group_sale_bonuses AS gsb ON gsb.product_id = m.product_id
    WHERE gsb.product_id IS NULL ;
    

    您可以通过添加到 where 子句将其过滤到特定的 product_id

    SELECT m.product_id, m.member_id FROM members AS m 
    LEFT JOIN group_sale_bonuses AS gsb ON gsb.product_id = m.product_id
    WHERE gsb.product_id IS NULL AND m.product_id = 1;
    

    看看这个 SQLfiddle:http://sqlfiddle.com/#!2/8482c/2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      • 2020-08-29
      • 1970-01-01
      相关资源
      最近更新 更多