[英]SQL multiple statements with conditions
我正在嘗試在一個查詢中對SQL語句進行排序以獲取身份驗證序列。
用戶
╔════╦══════════════╦══════════╗
║ id ║ emailAddress ║ password ║
╠════╬══════════════╬══════════╣
║ 1 ║ test1 ║ pass1 ║
║ 2 ║ test2 ║ pass2 ║
║ 3 ║ test3 ║ pass3 ║
╚════╩══════════════╩══════════╝
user_token
╔═══════╦═════════╗
║ token ║ user_id ║
╠═══════╬═════════╣
║ t1 ║ 1 ║
║ t2 ║ 2 ║
║ t3 ║ 3 ║
╚═══════╩═════════╝
我的嘗試(部分)請注意,我可以結合使用以;
分隔的幾個sql語句;
有條件的插入
INSERT INTO user_token(token, user_id) SELECT ?, ? FROM DUAL WHERE EXISTS (SELECT * FROM user WHERE emailAddress = ? AND password = ?); ["t1", 1, "test1", "pass1"];
設置某種變量,將其與其他嘗試組合。
SELECT @id:=id, emailAddress, password FROM user WHERE emailAddress = "test1" AND password = "pass1";
我想我已經接近了,但是在子查詢外部訪問@id時遇到了問題。
serviceRequest.sql = "INSERT INTO user_token(token, user_id)\\ SELECT ?, @id FROM DUAL WHERE EXISTS ( SELECT @id:=id, emailAddress, password FROM user WHERE emailAddress = ? AND password = ? ); SELECT @id, ? FROM DUAL"; serviceRequest.values = ["t1", "test1", "pass1", "t1"];
目的 :
借助IF
子句和SQL中的用戶定義變量等,在單個事務/執行中將采用邏輯的多個SQL語句組合在一起以實現身份驗證過程。
也許您正在尋找last_insert_id()
和row_count()
。 為了安全起見,我將這些分配給變量:
INSERT INTO user_token(token, user_id)
SELECT ?, ? FROM DUAL
WHERE EXISTS (SELECT * FROM user WHERE emailAddress = ? AND password = ?);
SELECT @row_count := ROW_COUNT(), @last_insert_id = LAST_INSERT_ID();
SELECT u.*
FROM user
WHERE @row_count > 0 AND emailaddress = ? and password = ?;
我不確定這是否正是您想要的,但這確實顯示了您可能需要的兩個功能的使用。
破解了下來。最后,但我需要查詢#2的改進,使用IF,而不是執行另一個SELECT
內聲明WHERE EXISTS
的人?
serviceRequest.sql = "SET @emailAddress = ?, @password = ?;\
SELECT @authToken:= ? AS authToken, @id:=id AS id FROM user WHERE emailAddress = @emailAddress AND password = @password;\
INSERT INTO user_token(authToken, user_id) \
SELECT @authToken, @id FROM DUAL WHERE EXISTS (SELECT id FROM user WHERE emailAddress = @emailAddress AND password = @password);";
serviceRequest.values = [request.body.credentials.emailAddress, request.body.credentials.password, "t3"];
查詢#1 。 首先用戶記錄被檢索和變量( @token
, @id
)設置並返回結果集。
查詢#2 。 如果記錄存在,則將執行user_token插入
感謝有人可以改善此答案並進一步優化查詢,尤其是查詢#2,其中還有另外一條選擇語句,我相信WHERE EXISTS
可以利用檢查@id
是否為null來進行插入操作,而我不知道不必在values
數組中兩次傳遞用戶名/密碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.