Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Condicional en un where

Estas en el tema de Condicional en un where en el foro de Mysql en Foros del Web. Hola a todos, Necesito hacer una query con un condicional en el where y no se como hacerla, de hecho no se si se puede ...
  #1 (permalink)  
Antiguo 11/11/2008, 05:08
Avatar de SUSMO  
Fecha de Ingreso: abril-2008
Ubicación: Barcelona
Mensajes: 188
Antigüedad: 16 años
Puntos: 0
Condicional en un where

Hola a todos,

Necesito hacer una query con un condicional en el where y no se como hacerla, de hecho no se si se puede ya que en la documentación de MYSQL el condicional, ya sea CASE o IF lo ponen en el SELECT y no en la parte del WHERE.

Me explico, tengo la siguiente tabla que guarda la traducción del nombre de los campos dependiendo del idioma:

columnas:
col_name ------- malg_code ------ lang

datos:
user_id ----------- ang --------------- User
user_id ----------- cas ---------------- Usuario
user_id ----------- cat ----------------- Usuari
password -------- ang ---------------- Password
password -------- cas ---------------- Contraseña
password -------- cat -----------------
email -------------- ang ---------------- Mail
email -------------- cas ---------------- Correo
email -------------- cat ---------------- Correu

El caso es que la query me tiene que devolver el nombre del campo (p.ej: user_id) y el nombre traducido según un idioma concreto (p.ej: User) mi problema es que si el campo no tiene traducción en ese idioma como es el password con el código cat me tiene que devolver otro idioma, por ejemplo el inglés.

Mi idea es hacer una consulta del estilo siguiente:

Código PHP:

SELECT col_name
l.malg__codel.lang_name as lang
FROM userstc_malg l
WHERE 
IF (malg__code "cas" and l.lang_name != ""THEN (malg__code "ang"
Es decir, si el lenguaje según el código de idioma está vacío que me muestre la traducción en otro idioma.
La cosa está en hacerlo en una sola consulta.
¿Alguien sabe como puedo hacerlo?

Saludos,
__________________
Perdida en el mundo del conocimiento
  #2 (permalink)  
Antiguo 11/11/2008, 15:43
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Condicional en un where

Dos sugerencias:
1) crear un campo traddefault o algo así, y poner en él la traducción, y otro campo langdefault, y así en el caso de password para cat, escribiría en traddefault password y en langdefault ang. Sólo tendrías que escribir los datos default cuando faltara el lang_name, como en ese caso. Luego en la selección condiciono a que si el campo lang_name está vacío, se traiga como malg_code ang y como lang_name el dato de langdefault, es decir, password.
Código sql:
Ver original
  1. SELECT IF(lang_name="", traddefault, lang_name) trad, IF(lang_name="", langdefault, malg_code) lengua FROM userstc_malg WHERE malg_code = "cat" AND col_name = "password"

2) Otra opción es hacerlo con programación. En la consulta te traes siempre el valor de cat y el de ang. Luego cargas en tu programa y si el valor de lang_name de cat está vacío, usaría el de ang.

Código sql:
Ver original
  1. SELECT lang_name, malg_code
  2. FROM userstc_malg
  3. WHERE col_name = "password"
  4. AND (
  5. malg_code = "cat"
  6. OR malg_code = "ang"
  7. )
  8. ORDER BY malg_code DESC
ordeno descendente para que siempre cargue el inglés, ang, al final, y poder procesar antes las demás lenguas...
Pero si quieres una solución rebuscada con MySQL, puedes lanzar una consulta como esta:


Código sql:
Ver original
  1. SELECT u.col_name, IF( t1.trad = '', u.malg_code, t1.leng ) lengua, IF( t1.trad = '', u.lang_name, t1.trad ) traduccion
  2. FROM userstc_malg u
  3. INNER JOIN (
  4.  
  5. SELECT col_name col, malg_code leng, lang_name trad
  6. FROM `userstc_malg`
  7. WHERE col_name = "password"
  8. AND malg_code = "cat"
  9. )t1 ON t1.col = u.col_name
  10. WHERE u.col_name = "password"
  11. AND u.malg_code = "ang"

Se trae en el centro mediante selección el valor para cat, luego realiza un inner join con la consulta que se trae eso mismo para ang, usando como union el valor del campo col_name, que es password, y muestra, en el caso de que lang_name de la segunda consulta sobre cat esté vacío, el lang_name de ang, y también el malg_code...

Yo no recomiendo hacer dos consultas sobre la misma tabla, cuando podrías resolverlo con una y cargando con programación, o resolviendo mediante esos campos default.

Es lo que se me ocurre.

Última edición por jurena; 11/11/2008 a las 17:16
  #3 (permalink)  
Antiguo 12/11/2008, 05:48
Avatar de SUSMO  
Fecha de Ingreso: abril-2008
Ubicación: Barcelona
Mensajes: 188
Antigüedad: 16 años
Puntos: 0
Respuesta: Condicional en un where

Hola jurena,

Muchas gracias por tus respuestas, la verdad es que pensaba que con una query del estilo a la que puse se podría hacer solo que no tenía conocimientos para hacerla jeje

Al final opto por hacer la segunda propuesta que me has dado, consulta sencilla y mostrando la traducción del campo según el idioma por programación, veo que es la más viable, ya que el hecho de añadir dos campos nuevos a la tabla no me interesa y como a ti, en este caso, hacer una query rebuscada cuando puedo hacerla sencilla no me gusta.

Saludos y gracias de nuevo.
__________________
Perdida en el mundo del conocimiento
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:33.