SQL:使用条件

时间:2017-11-13 17:42:05

标签: php mysql sql

要了解我想要实现的目标,这是我的问题:

  • 我有一个" Place"在php array + sql table name" Place"
  • 每个" Place"可以有一个或多个" Place_Box"
  • 每个" Place_Box"有(或没有)一些" Slot_Place_Box"
  • 这个" Slot_Place_Box"有字段"日期","小时"," slot_available"
  • 现在我有一个"日期" +一小时"小时"在一些php数组中(某些日期有小时,其他没有)
  • 我有一个" Type" var中的PHP(" 1"," 2"或" 3")

我想做什么:

  • 我需要检查每个" Place",每个" date" /" hour"我已经有一个" Slot_Place_Box"在数据库中:
  • 如果是:我更新" slot_available" - >当前数据 - 输入
  • 如果否:我创建一个新的" Slot_Place_Box" - > date + hour + slot_available = 3 - type
  • 然后:我必须得到最后一个ID(我创建的新ID或我更新的ID)并创建一个新的" Slot_config"带有此ID的数据+我在php var。
  • 中拥有的其他ID

是否可以在一个脚本/请求中实现此功能,仅使用MySQL和php? 我只想重复几次并避免在php foreach循环中提出请求......

  • 我看到这个用来做"更新或插入"部分:link
  • 我在&#34中看到了这一个;在一个查询中插入多行"部分:link

但我怀疑我可以将这两者结合起来...我想做这样的事情,但我几乎可以肯定这是错误的,我必须至少提出一个请求。 #34;将" :

INSERT INTO Slot_Place_Box ( Date, Hour ) VALUES
    ( "2017-11-01", "23:00:00" )
ON DUPLICATE KEY UPDATE
    Date = "2017-11-01", Hour = "23:00:00"
LEFT JOIN "Place_Box" as PB ON PB.id_place_box = Slot_Place_Box.id_place_box
INNER JOIN "Place" as P ON P.id_place = PB.id_place

@id = SELECT LAST_INSERT_ID() or @id = (SELECT id FROM slot_place_box WHERE date = "2017-11-01" AND hour = "23:00:00"

INSERT INTO "Slot_config" (id_slot_pb, id_config) VALUES (@id, :id_config)

我希望我的问题足够明确,能够理解我想要实现的目标,我是SQL的初学者所以如果你只是有一些"逻辑"帮我制作我的剧本非常好:)

编辑1:

经过一天的努力,我认为我会这样做:

  • 我得到了每一个" id_place_box"根据我的" Place"数据
  • 然后我将创建一个数组,其中包含" id_place_box" /"日期" /"小时"
  • 然后我会做一个" SELECT"所有" slot_place_box"我在哪里可以找到id_place_box / date / hour - >的组合我得到" slot_available" +" id_slot_pb"值,然后我更新每个结果并将id保存在数组中。
  • 我现在可以制作一个INSERT IGNORE new" slot_place_box"所有组合" id / date / hour"并将每个新ID添加到我的ID数组中。
  • 然后我创建了一个新的" slot_config"我的数组中的foreach id

我认为它应该像这样工作

编辑2:

我不确定自己能做什么(一次插入或更新多行),原因如下:

  • 我无法真正更新" slot_available"字段在" Slot_place_box"有一些计算,我需要获取当前值,然后根据我的"类型"找到新值。价值:我无法做到

    INSERT INTO Slot_Place_Box ( id_place_box, Date, Hour ) VALUES
      ( :id_place_box_1, :date_1, :hour_1 ), 
      ( :id_place_box_2, :date_2, :hour_2 ), 
      ...
      ( :id_place_box_n, :date_n, :hour_n )n
    ON DUPLICATE KEY UPDATE slot_available = [some calcul]
    
  • 另一个问题是,如果我在一个请求中执行所有操作,我无法获得所有ID更新或插入的ID。每次更新或插入后,我都需要将id保留在某处。

1 个答案:

答案 0 :(得分:0)

我不知道它是否是最佳解决方案,但我得到了我想要的结果。我用" id_pb / date / hour"循环遍历我的数组; data和foreach行我创建了一个新请求:

foreach($SPB_data_array as $index => $SPB_data) {
    $current_id_pb = $SPB_data['id_pb'];
    $current_date  = $SPB_data['date'];

    if (!empty($SPB_data['hour'])) {
        $current_hour = $SPB_data['hour'];
        $sql_slot_pb .= 'INSERT INTO media.slot_place_box (id_place_box, date, hour)
                         VALUES ('. $current_id_pb .', \''. $current_date .'\', \''. $current_hour .'\')
                         ON DUPLICATE KEY UPDATE id_slot_pb=id_slot_pb;
                         SET @id = (SELECT SPB.id_slot_pb FROM media.slot_place_box as SPB
                               WHERE SPB.id_place_box = '. $current_id_pb .' AND SPB.date = \''. $current_date .'\' AND SPB.hour = \''. $current_hour .'\');
                         INSERT INTO media.slot_config (id_config, id_slot_pb) VALUES (:new_config_id, @id);
                         ';
    } else {
        $sql_slot_pb .= 'INSERT INTO media.slot_place_box (id_place_box, date, hour)
                         VALUES ('. $current_id_pb .', \''. $current_date .'\', NULL)
                         ON DUPLICATE KEY UPDATE id_slot_pb=id_slot_pb;
                         SET @id = (SELECT SPB.id_slot_pb FROM media.slot_place_box as SPB
                               WHERE SPB.id_place_box = '. $current_id_pb .' AND SPB.date = \''. $current_date .'\' AND SPB.hour IS NULL);
                         INSERT INTO media.slot_config (id_config, id_slot_pb) VALUES (:new_config_id, @id);
                         ';
    }
}
$sql_slot_pb = $bdd->prepare($sql_slot_pb);
$sql_slot_pb->bindParam(':new_config_id', $new_config_id);
$sql_slot_pb->execute();

我得到了" $ new_config_id"在我创建INSERT配置数据之前,我创建了一个SQL触发器来更新" slot_available"领域:

CREATE DEFINER= ***** TRIGGER slot_config_AFTER_INSERT AFTER INSERT ON `slot_config` FOR EACH ROW
BEGIN
SET @type_config = 
    (SELECT CC.type 
    FROM config_campaign   as CC
    INNER JOIN slot_config as SC ON SC.id_config = CC.id_config 
        AND SC.id_slot_pb = NEW.id_slot_pb
        AND SC.id_config = NEW.id_config
    );

IF @type_config = 1
    THEN SET @value_type = 3;
ELSE
    IF @type_config = 2
        THEN SET @value_type = 1.50;
    ELSE
        IF @type_config = 3
            THEN SET @value_type = 1.00;
        END IF;
    END IF;
END IF; 

SET @current_slot_available = 
    (SELECT SPB.slot_available
    FROM slot_place_box as SPB
    WHERE SPB.id_slot_pb = NEW.id_slot_pb
    ); 

UPDATE slot_place_box SET slot_available = (@current_slot_available - @value_type) WHERE id_slot_pb = NEW.id_slot_pb;
END