IN 子句在 mysql 8.0.17 上不起作用
我在 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 有效嗎?
請注意區別:您正在觸摸兩個不同的表。那是故意的嗎?