在这里循环使用SQL或PHP更好吗

时间:2019-03-06 08:24:52

标签: php mysql sql

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

1 个答案:

答案 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

  

demo on dbfiddle.uk