Mysql
MySQL 結果集根據選擇列表更改
所以這有點奇怪,因為我以前從未處理過這個問題。我有一個包含 4 個基本連接的數據集,用於查找編輯、創建記錄集的使用者。
SELECT `tasks`.`id`, `tasks`.`title`, `tasks`.`description`, `tasks`.`created_ts`, `tasks`.`modified_ts`, assigned_user_id, `u1`.`id` AS `assigned_to_id`, `u1`.`firstname` AS `assigned_to_firstname`, `u1`.`surname` AS `assigned_to_surname`, `u2`.`id` AS `author_id`, `u2`.`firstname` AS `author_firstname`, `u2`.`surname` AS `author_surname`, `u3`.`id` AS `modified_by_id`, `u3`.`firstname` AS `modified_by_firstname`, `u3`.`surname` AS `modified_by_surname`, `t1`.`id`AS `priority_id`, `t1`.`priority` AS `priority_priority`, author_user_id, modified_by_user_id, type_priority_id FROM tasks LEFT OUTER JOIN `users` u1 ON `u1`.`id` = `tasks`.`assigned_user_id` LEFT JOIN `users` u2 ON `u2`.`id` = `tasks`.`author_user_id` LEFT JOIN `users` u3 ON `u3`.`id` = `tasks`.`modified_by_user_id` LEFT JOIN `type_priority` t1 ON `tasks`.`type_priority_id` = `t1`.`id` LIMIT 100
當我執行這個查詢時,我只得到一個特定使用者(ID:1)的結果。它只是跳過與不同使用者連接的所有其他記錄。有趣的是,當我不從使用者表(u1、u2 和 u3)中選擇欄位時,我得到了我期望的所有結果。
您沒有指定順序,因此 LIMIT 會按照查詢讀取它們的順序選擇前 100 行。
該順序取決於優化器選擇的索引以及表順序。考慮到查詢中的列和條件,優化器會嘗試根據它認為最有效的方式來選擇這些。
因此,從選擇列表中省略某些列可能會導致不同的索引,因此首先讀取一組不同的行。
您應該使用 EXPLAIN 來分析您的兩個查詢表單的表順序和索引選擇。