Ver Mensaje Individual
  #1 (permalink)  
Antiguo 11/11/2007, 10:52
Sanva
 
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.