簡體   English   中英

帶條件的SQL多條語句

[英]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 ║
╚═══════╩═════════╝
  1. 檢查記錄是否存在以及emailAddress和密碼
  2. 如果找到匹配項,則將帶有user_id的令牌插入到user_token表中
  3. 發回resultSet中的用戶記錄

我的嘗試(部分)請注意,我可以結合使用以;分隔的幾個sql語句;

  1. 有條件的插入

     INSERT INTO user_token(token, user_id) SELECT ?, ? FROM DUAL WHERE EXISTS (SELECT * FROM user WHERE emailAddress = ? AND password = ?); ["t1", 1, "test1", "pass1"]; 
  2. 設置某種變量,將其與其他嘗試組合。

     SELECT @id:=id, emailAddress, password FROM user WHERE emailAddress = "test1" AND password = "pass1"; 
  3. 我想我已經接近了,但是在子查詢外部訪問@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM