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

La consulta SQL que mató al gato

Estas en el tema de La consulta SQL que mató al gato en el foro de Mysql en Foros del Web. Hola a todos, Os comento mi problema por si a alguien se le ocurre una solucion. El tema es que tengo una tabla de noticias ...
  #1 (permalink)  
Antiguo 17/04/2009, 06:46
 
Fecha de Ingreso: abril-2009
Mensajes: 4
Antigüedad: 15 años, 7 meses
Puntos: 0
La consulta SQL que mató al gato

Hola a todos,

Os comento mi problema por si a alguien se le ocurre una solucion.

El tema es que tengo una tabla de noticias para una Web, cada noticia puede estar hasta en 4 idiomas, cuando muestro el listado de noticias en la Web han de aparecer en 1 idioma (elegido por el usuario) pero si esa misma noticia no esta disponible en ese idioma ha de mostrar un mensaje que da acceso a leerla en los idiomas que esté disponible.

Me gustaria encontrar una consulta óptima y he intentado hacer una compleja con subconsultas y demás pero no soy un gran experto y estoy hecho un lio... no se si es mejor hacer muchas consultas o hacer solo una y gestionar luego el resultado en PHP, en cualquier caso... no lo encuentro..

Escribo un ejemplo ( simplificado ) de una fila de la tabla para que veaís la estructura:

id_news_lng -->1en
id_news-->1
id_lng-->en
fecha-->20081121

la misma pero en castellano

id_news_lng -->1es
id_news-->1
id_lng-->es
fecha-->20081121

Espero que algun master lea esto y pueda ayudarme. gracias!
  #2 (permalink)  
Antiguo 17/04/2009, 07:07
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: La consulta SQL que mató al gato

Pregunta, esas filas son de la misma tabla


id_news_lng:::id_news:::id_lng::::::::fecha
1en:::::::::::::::::::::1:::::::::::en::::::::2008 1121
1es:::::::::::::::::::::1:::::::::::es::::::::2008 1121


No soy master pero si es así yo haria un consulta muy simple


Código sql:
Ver original
  1. SELECT id_news_lng,id_news,id_lng,fecha,texto_news
  2. FROM tabla
  3. WHERE id_news=X

con lo que obtendria una tupla de como maximo 4 registros .... muy facil de gestionar des de php. Si son cortas podrias traerte el texto de la news,texto_news, si esta en la misma tabla o incluso si esta en otra tabla con el pertinente join.

Es decir buscaria directamente la noticia por su id_news (en todos los idiomas que haya, no por id_news_lng) y luego en php seleccionaria la versión (idioma) que me ha pedido el usuario, si no la tengo mostraria el mensaje pertinente, e incluso podria mostrar un link a cada una de las otras versiones....

Todo se haria con una sola consulta a la bbdd.

Para matar al gato se puede complicar mucho una la vida pero quizas en este caso no hace falta

Quim
  #3 (permalink)  
Antiguo 17/04/2009, 07:31
 
Fecha de Ingreso: abril-2009
Mensajes: 4
Antigüedad: 15 años, 7 meses
Puntos: 0
Sonrisa Respuesta: La consulta SQL que mató al gato

Gracias por tu respuesta,

Si, las filas pertenecen a una sola tabla.

Es buena solucion, con ella tenemos la noticia en 4 idiomas, como bien dices. Entonces, ¿como seria el proceso completo para mostrar todas las noticias?

¿Primero seleccionar cuantas noticias tengo? algo así

Código:
SELECT id_news FROM news GROUP BY id_news ORDER BY fecha;
y despues hacer una consulta para cada noticia usando un bucle, ¿no?

Código:
SELECT * FROM rem.news WHERE id_news = i;
Es una solucion simple y buena, no se por que me compliqué tanto, supongo que no queria realizar tantas consultas, ¿sabes si es una buena practica el realizar una consulta por cada noticia? ¿o si esto sobrecargaria el servidor?

Un saludo
  #4 (permalink)  
Antiguo 20/04/2009, 01:50
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: La consulta SQL que mató al gato

Si vas a consultar todas las noticias no hace falta el bucle

Código sql:
Ver original
  1. SELECT * FROM rem.news ORDER BY id_news,id_lng

de manera que com una sola consulta te las dará ordenadas por id y por idioma.... como sabes de antemano en que orden van a salir los 4 idiomas, te serà facil gestionar ahora si con un bucle la falta de alguno de ellos...

Por lo que tendreas una sola consulta, un bucle que recorra todas las noticias y otro interno que recorra los idiomas de cada noticia...

En mi primera respuesta pensaba en obtener una noticia concreta, para todas las noticias quizas tendras que paginar con lo que podrias hacer consultas para cada pagina (mostrar la noticias de 10 en 10 para decir algo...)

Código sql:
Ver original
  1. SELECT * FROM rem.news ORDER BY id_news,id_lng LIMIT 0,10


Quim

Última edición por quimfv; 20/04/2009 a las 02:00
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 13:50.