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

Relaciones entre varias tablas (pero no uno a uno)

Estas en el tema de Relaciones entre varias tablas (pero no uno a uno) en el foro de Mysql en Foros del Web. Primero os expongo la estructura de la base de datos (simplificando) que estoy creando (aclaro que tengo muy pocos conocimientos de BBDD, así que cualquier ...
  #1 (permalink)  
Antiguo 11/11/2007, 10:52
 
Fecha de Ingreso: diciembre-2005
Ubicación: Redondela (Galicia)
Mensajes: 368
Antigüedad: 18 años, 4 meses
Puntos: 1
Relaciones entre varias tablas (pero no uno a uno)

Primero os expongo la estructura de la base de datos (simplificando) que estoy creando (aclaro que tengo muy pocos conocimientos de BBDD, así que cualquier sugerencia sobre el diseño de la misma es bienvenida):

Código:
-- 
-- Estructura de tabla para la tabla `posts`
-- 

CREATE TABLE `posts` (
  `id` smallint(5) unsigned NOT NULL auto_increment,
  `title` text collate utf8_unicode_ci NOT NULL,
  `content` mediumtext collate utf8_unicode_ci NOT NULL,
  `date` int(10) unsigned NOT NULL default '0',
  `author` tinyint(3) unsigned NOT NULL default '0',
  `num_comments` smallint(5) unsigned NOT NULL default '0',
  `type` enum('published','draft','private','pending','note','deleted') collate utf8_unicode_ci NOT NULL default 'published',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- --------------------------------------------------------

-- 
-- Estructura de tabla para la tabla `tags`
-- 

CREATE TABLE `tags` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `tag` varchar(60) collate utf8_unicode_ci NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- --------------------------------------------------------

-- 
-- Estructura de tabla para la tabla `tags_relations`
-- 

CREATE TABLE `tags_relations` (
  `id` bigint(20) unsigned NOT NULL auto_increment,
  `id_tag` int(10) unsigned NOT NULL default '0',
  `id_post` smallint(5) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Lo que pretendo conseguir es, teniendo determinados posts y determinados tags en sus respectivas tablas, crear relaciones entre ellos mediante la tabla tags_relations.

Utilizo la siguiente consulta para conseguir la información ya relacionada:

Código:
SELECT *
FROM posts
INNER JOIN tags JOIN tags_relations
ON tags_relations.id_post = posts.id AND tags_relations.id_tag = tags.id;
El problema:

Esa consulta me devuelve los datos relacionados, pero duplicados. Es decir, me devuelve una fila por cada relación: Si un post tiene 3 tags, me devuelve 3 filas para él, con los mismos datos todas ellas menos las columnas de la tabla de tags, que cambian (lógicamente).
Lo que yo quiero es que me devuelva una fila sola, con más columnas o algo así (tipo tag1, tag2... tagN) por cada post.

Aclaro que no se si lo que pido es posible con mi diseño, y si creéis que esta relación debería crearse de otra forma (por ejemplo desde la aplicación y no directamente en la base de datos) decidlo y yo estaré encantado de aprender.

Saludos, y gracias por vuestro tiempo.
  #2 (permalink)  
Antiguo 15/12/2007, 10:22
 
Fecha de Ingreso: noviembre-2004
Mensajes: 159
Antigüedad: 19 años, 5 meses
Puntos: 0
Mensaje Re: Relaciones entre varias tablas (pero no uno a uno)

Hola Amigo, tuve un problema similar al que tu presentas, He visto modelos en los cuales en la tabla relacional (bajo el concepto el "Disco es barato") usan una tabla relacionalde este tipo

id --- post_id -- tag_id ---- tag_id2----tag_id3 --- tag_id4


Claro no necesariamente se van a llenar los registros ya que habra posts que tendran al menos 1 tag, y otros con 2 etc.

Si encontraste otra solución podrás compartirla?

Saludos Cordiales.
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 22:18.