Necesito recuperar todas las configuraciones predeterminadas de la tabla de configuraciones pero también tomar la configuración de caracteres si existe para el carácter x.
Pero esta consulta solo recupera la configuración donde el carácter es = 1, no la configuración predeterminada si el usuario no ha configurado a nadie.
SELECT `settings`.*, `character_settings`.`value`
FROM (`settings`)
LEFT JOIN `character_settings`
ON `character_settings`.`setting_id` = `settings`.`id`
WHERE `character_settings`.`character_id` = '1'
Entonces debería necesitar algo como esto:
array(
'0' => array('somekey' => 'keyname', 'value' => 'thevalue'),
'1' => array('somekey2' => 'keyname2'),
'2' => array('somekey3' => 'keyname3')
)
Donde la clave 1 y 2 son los valores predeterminados cuando la clave 0 contiene el valor predeterminado con el valor del carácter.
fuente
Puede que le resulte más fácil de entender utilizando una simple subconsulta
La subconsulta puede devolver nulo, por lo que no tiene que preocuparse por JOIN / WHERE en la consulta principal.
A veces, esto funciona más rápido en MySQL, pero compárelo con el formulario LEFT JOIN para ver qué funciona mejor para usted.
fuente
El resultado es correcto según la instrucción SQL. La unión izquierda devuelve todos los valores de la tabla derecha y solo los valores coincidentes de la tabla izquierda.
Las columnas ID y NAME son de la tabla del lado derecho, por lo que se devuelven.
La puntuación es de la tabla de la izquierda y se devuelve 30, ya que este valor se relaciona con el Nombre "Flow". Los otros nombres son NULL ya que no se relacionan con el Nombre "Flow".
Lo siguiente devolverá el resultado que esperaba:
El SQL aplica un filtro en la tabla de la derecha.
fuente
Para este problema, como para muchos otros que involucran uniones izquierdas no triviales como la unión izquierda en tablas unidas internamente, encuentro conveniente y algo más legible dividir la consulta con una
with
cláusula. En tu ejemplo,fuente