Mysql

MySQL 結果集根據選擇列表更改

  • August 9, 2022

所以這有點奇怪,因為我以前從未處理過這個問題。我有一個包含 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 來分析您的兩個查詢表單的表順序和索引選擇。

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