亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在單個準備好的語句中執行 > 1 個 SQL 語句

在單個準備好的語句中執行 > 1 個 SQL 語句

PHP
慕哥9229398 2023-08-19 17:41:34
好吧,我會嘗試盡可能簡單地解釋它;考慮我有兩個數據庫表(MySQL Server / MariaDB,使用準備好的語句在 PHP 中以過程風格編碼的數據庫相關任務):其中,我有一列數據類型 JSON,其內容對應于諸如{name1:info,name2:info}在另一個記錄中,我有簡單的非 json 記錄,其結構如下:name  | status------+--------name1 | statusX------+--------name2 | statusY我的目標:我需要從表 1 中檢索 name2,但我還需要檢索具有相同名稱的人的狀態(在本例中為 statusY)。請注意,對于 name2 的檢索,我不能依賴 json 對象的索引(name2 可能是 json 對象的第一個鍵)。到目前為止我會如何做:A)在第一個查詢中從表1)獲取name2,對其進行清理,B)在第二個查詢中使用它,然后正確檢索statusY語句 A) 和 B) 都是參數化的準備好的 SQL 語句,由 AJAX 調用定期觸發(AJAX 輪詢)。鑒于這些數據庫查詢被頻繁執行,我希望它們盡可能快地執行,從而理想地將上面的兩個查詢減少為單個查詢。我的問題:我需要語句 A) 的結果來執行語句 B),因此我無法將兩個查詢匯總為單個準備好的語句,因為準備好的語句不能包含多個 sql 語句。達到我想要的效果的最佳解決方案是創建一個存儲過程,例如:SET @name = SELECT ..... FROM table_1; SELECT .... FROM table_2;然后將其作為參數化準備語句執行;那是對的嗎?我對 MySQL Server 中的存儲過程完全沒有經驗,實際上還不需要它們,但如果您想將 > 1 個 sql 語句包裝到單個準備好的語句中,它們似乎是唯一的解決方案。這個假設以及我必須創建一個存儲過程才能達到我想要的結果的結論是否正確?重要提示:我不知道我需要查詢的名稱。從表1)的json列的兩個名稱中,我只知道另一個名稱。換句話說,我有一個人X的名字,我想獲取表1)中與該人X關聯的所有人的狀態,而每個人的狀態在表2)中列出,以避免數據庫中存在重復的狀態存儲。ATM,我通過使用條件語句從 DB 1) 檢索每個關系記錄的其他名稱,例如更新請參閱下面添加的答案,讓它正常工作。
查看完整描述

2 回答

?
慕尼黑5688855

TA貢獻1848條經驗 獲得超2個贊

您可以使用 MySQL 查詢 JSON 數據類型(如果版本 > 5.7),因此您可以通過單個查詢輕松完成所有操作


嘗試一下


SELECT t1.name1, t1.name2, t2.status

FROM

(

  SELECT  JSON_EXTRACT(your_json_column, "$.name1") AS name1,

        JSON_EXTRACT(your_json_column, "$.name2") AS name2

  FROM table1

  WHERE JSON_EXTRACT(your_json_column, "$.name1") = 'info'

) t1

INNER JOIN table2 t2 ON t2.`name`=t1.name2

調整名稱your_json_column。另外,我假設您想要搜索name2特定的name1,因此我的WHERE子句,如果它是錯誤的假設,請將其刪除。


查看完整回答
反對 回復 2023-08-19
?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

好的,它可以工作了,非常感謝 Thomas G 提出的解決方案和 JNevill 的一些提示(干杯?。?/p>


SELECT t1.info1, t1.info2, t1.info3, t1.other_name, t2.status FROM (

    SELECT

    field1 AS info1,

    field2 AS info2,

    field3 AS info3,

    CASE

    WHEN JSON_VALUE(JSON_KEYS(json_names_column),"$[0]") = 'name1'

    THEN JSON_VALUE(JSON_KEYS(json_names_column),"$[1]")

    ELSE JSON_VALUE(JSON_KEYS(json_names_column),"$[0]")

    END

    AS other_name

    FROM table1

    WHERE id = 345

) t1 INNER JOIN table2 t2 ON t1.other_name = t2.name;

請注意,我使用 JSON_VALUE(JSON_KEYS()) 而不是 JSON_EXTRACT,只返回所需的名稱作為 t1 的名稱數據,并且因為我不知道在查詢之前檢索的名稱,所以我無法使用 Thomas 提出的WHERE子句G。


查看完整回答
反對 回復 2023-08-19
  • 2 回答
  • 0 關注
  • 136 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號