Home >Database >Mysql Tutorial >How to Properly Left Join with a Filtered Right-Hand Table to Retrieve All Default Settings and Optional Custom Settings?
Left join using filtered left table
This question discusses retrieving data from two tables, where a WHERE clause in the left table prevents the expected results from occurring. The goal is to retrieve all default settings from the settings table and, if available, any role-specific custom settings for a specific role.
Original query:
<code class="language-sql">SELECT `settings`.*, `character_settings`.`value` FROM (`settings`) LEFT JOIN `character_settings` ON `character_settings`.`setting_id` = `settings`.`id` WHERE `character_settings`.`character_id` = '1' </code>
However, this query only returns rows where there is a matching character-specific setting for the specified character (character_id = 1). In order to include default settings (even if no role-specific settings exist), the WHERE clause should be moved to the connection itself:
<code class="language-sql">SELECT `settings`.*, `character_settings`.`value` FROM `settings` LEFT JOIN `character_settings` ON `character_settings`.`setting_id` = `settings`.`id` AND `character_settings`.`character_id` = '1' </code>
This modified query now effectively performs a left join where the left table (settings) is not filtered by any criteria. Therefore, it retrieves all default settings while optionally including any role-specific settings if they exist.
The above is the detailed content of How to Properly Left Join with a Filtered Right-Hand Table to Retrieve All Default Settings and Optional Custom Settings?. For more information, please follow other related articles on the PHP Chinese website!