Mysql

IN 子句在 mysql 8.0.17 上不起作用

  • May 2, 2021

我在 mysql:8.0.15 上,我更新到 mysql:8.0.17

  • 在 8.0.15... and (col1, col2) in (('a', 'b'))查詢返回結果,這是我所期望的
  • 在 8.0.17 上,具有相同數據的相同查詢返回 0 個結果。

我以為這是我們的應用程序,所以我降級回 8.0.15 並且查詢再次執行……

我注意到... and (col1, col2) in (('a', 'b'),('a', 'b'))正在工作8.0.17

我試圖搜尋 mysql 錯誤列表,但找不到任何資訊…在更改日誌中,我看到他們在 8.0.17 中優化了 WHERE IN,但它不應該破壞我的案例。

優化器現在將內部具有 NOT IN(子查詢)、NOT EXISTS(子查詢)、IN(子查詢)IS NOT TRUE 或 EXISTS(子查詢)IS NOT TRUE 的 WHERE 條件轉換為反連接,從而刪除子查詢。這類似於現有的 IS NULL(不存在)外連接優化;請參閱解釋額外資訊,了解更多資訊。此外,半連接物化現在可用於 IN(子查詢)為 TRUE 或 EXISTS(子查詢)為 TRUE 的 WHERE 條件,或者當 IN 條件屬於左連接時,例如 SELECT * FROM t1 LEFT JOIN t2 ON t2.x 輸入(從 t3 中選擇 *)。請參閱使用半連接轉換優化 IN 和 EXISTS 子查詢謂詞。同樣作為這項工作的結果,MySQL 現在能夠簡化一個 co

似乎太大了,不能成為 mysql 中的錯誤。我錯過了什麼嗎?

這是完整的查詢

select `t1`.`user_id`    as `user_id`,
      `t1`.`created_at` as `created_at`,
      `t1`.`updated_at` as `updated_at`,
      `t3`.`node_id`    as `t3node_id`,
      `t3`.`node_type`  as `t3node_type`,
      `t2`.`node_id`    as `t2node_id`,
      `t2`.`node_type`  as `t2node_type`
from `table1` as `t1`
        inner join `table2` as `t2` on `t1`.`set_id` = `t2`.`set_id` and `t1`.`set_type` = `t2`.`set_type`
        left join `table2` as `t3`
                  on `t2`.`node_type` = 3 and `t3`.`set_type` = 5 and `t3`.`set_id` = `t2`.`node_id`
        left join `table3` as `ts` on COALESCE(t3.node_type, t2.node_type) = `ts`.`cache_node_type` and
                                                COALESCE(t3.node_id, t2.node_id) = `ts`.`cache_node_id`
where `t1`.`tenant_id` = '825773475713154048'
and (`t1`.`user_id`, `t2`.`node_id`) in ( ('825773502556700160', '825773839074099712'))

在 8.0.17 我得到 0 個結果。在 8.0.15 上它可以工作。

  • 如果在 8.0.17 上,我將最後一行替換為and (t1.user_id, t2.node_id) in ( ('825773502556700160', '825773839074099712'), ('825773502556700160', '825773839074099712'))(注意它是同一個元組,兩次),我會得到結果。
  • 它適用於這個and (t1.user_id, t2.node_id) = ('825773502556700160', '825773839074099712')
  • 我嘗試了一個簡單的查詢SELECT * FROM test.test as t1 WHERE (t1.col1,t1.col2) IN (('a','b'));,它適用於 8.0.17。

除了程式碼中的那個之外,您是否嘗試過一個簡單的 IN 子句?如果沒有,我會寫幾個簡單的並嘗試它們是否執行。如果它們執行成功,則要麼是您錯誤地複制了它,要麼是您的程式碼使用 IN 語句的具體方式。

如果沒有執行 IN 語句,則說明某些內容髮生了更改,無論是設計還是錯誤。

(評論太亂了)

如果你改變

and (`t1`.`user_id`, `t2`.`node_id`) in ( ('825773502556700160', '825773839074099712'))

and (`t1`.`user_id` = 825773502556700160
AND `t2`.`node_id` = 825773839074099712)

8.0.17 有效嗎?

請注意區別:您正在觸摸兩個不同的表。那是故意的嗎?

引用自:https://dba.stackexchange.com/questions/243699