要了解我想要实现的目标,这是我的问题:
我想做什么:
是否可以在一个脚本/请求中实现此功能,仅使用MySQL和php? 我只想重复几次并避免在php foreach循环中提出请求......
但我怀疑我可以将这两者结合起来...我想做这样的事情,但我几乎可以肯定这是错误的,我必须至少提出一个请求。 #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的初学者所以如果你只是有一些"逻辑"帮我制作我的剧本非常好:)
经过一天的努力,我认为我会这样做:
我认为它应该像这样工作
我不确定自己能做什么(一次插入或更新多行),原因如下:
我无法真正更新" 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保留在某处。
答案 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