SELECT voucherID FROM vouchers WHERE **lots of conditions**
让我们说我得到两个voucherID 5和6。
现在,对于每个优惠券ID,我都会执行一条INSERT
语句,其中voucherID
会出现在条件中。
用于插入两个voucherID(= 5)中的第一个的抽象伪代码:
INSERT INTO usevoucher(userID, voucherID)
SELECT userID FROM users WHERE *lots of conditions including voucherID = 5* ,
5 AS voucherID
FROM ...
(请注意,我使用voucherID
作为常量)
现在,我将在下一个INSERT
6中重复上面的voucherID
语句
据我所知,没有一种解决方案可以在一句话中做到所有这些。
最好将第一个SELECT
(5和6)的结果保存到PHP中的数组中,然后遍历该数组进行插入
或 直接在MySQL中循环(使用While,Repeat或For循环)会更好吗? (以获得最佳性能和代码风格)
编辑:
示例:
SELECT voucherID FROM vouchers WHERE active = 1
结果:
VoucherID
5
6
这些是与我的插入内容有关的代金券。 现在,所有在ownsvoucher中还没有凭证的用户都应该获得该凭证。
ownsvoucher
UserID VoucherID
44 5
50 6
60 NULL
70 NULL
50、60和70用户没有voucherID 5,因此我需要插入
50 5
60 5
70 5
用户44、60和70没有凭证6,所以我需要插入
44 6
60 6
70 6
答案 0 :(得分:3)
在这种情况下,您可以使用简单的INSERT INTO ... SELECT
:
toDoManupulateData = ()=>{
let allToDoData = this.state._toDoData;
let TO_DO = [];
let READY_FOR_DEVELOPEMENT = [];
let IN_PROGRESS = [];
let IN_QA = [];
let LIVE = [];
allToDoData.forEach((item)=>{
if(item.label === 'toDo'){
TO_DO.push(item);
}else if(item.label === 'readyForDevelopment'){
READY_FOR_DEVELOPEMENT.push(item);
}else if(item.label === 'inProgress'){
IN_PROGRESS.push(item);
}else if(item.label === 'inQa'){
IN_QA.push(item);
}else if(item.label === 'live'){
LIVE.push(item);
}
console.log(item);
});
console.log(TO_DO,READY_FOR_DEVELOPEMENT,IN_PROGRESS,IN_QA,LIVE);
this.setState({
TO_DO,READY_FOR_DEVELOPEMENT,IN_PROGRESS,IN_QA,LIVE
}, () => {
console.log(this.state);
});
}
基于您的修改的解决方案:
INSERT INTO usevoucher (userID, voucherID)
SELECT userID, voucherID
FROM users
WHERE (<your-conditions>) AND voucherID IN (5, 6, 7, 8, ...)
如果要过滤特定的INSERT INTO ownsvoucher (userID, voucherID)
SELECT users.userID, vouchers.voucherID
FROM (users, vouchers)
LEFT JOIN ownsvoucher ov ON ov.userID = users.userID AND ov.voucherID = vouchers.voucherID
WHERE vouchers.active = 1 AND ov.voucherID IS NULL
,可以添加voucherID
。