2012-01-31 64 views
0

嗨我看起来很简单的问题,这导致我的头受伤。Mysql在一行中获取多对多的关系数据

我有一个mysql数据库中的三个表,描述了文章标题和几个(可变数字)关键字之间的多对多关系。

文章:

+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| volume_id | varchar(11) | NO | MUL | NULL |    | 
| title  | longtext  | NO |  | NULL |    | 
+------------+--------------+------+-----+---------+----------------+ 

关键词:

+---------+--------------+------+-----+---------+----------------+ 
| Field | Type   | Null | Key | Default | Extra   | 
+---------+--------------+------+-----+---------+----------------+ 
| id  | int(11)  | NO | PRI | NULL | auto_increment | 
| keyword | varchar(355) | NO |  | NULL |    | 
+---------+--------------+------+-----+---------+----------------+ 

Article_keywords(通过表):

+------------+---------+------+-----+---------+----------------+ 
| Field  | Type | Null | Key | Default | Extra   | 
+------------+---------+------+-----+---------+----------------+ 
| id   | int(11) | NO | PRI | NULL | auto_increment | 
| article_id | int(11) | NO | MUL | NULL |    | 
| keyword_id | int(11) | NO | MUL | NULL |    | 
+------------+---------+------+-----+---------+----------------+ 

我要的是一个单一的表,其中一列包括标题和关联的关键字,以便可以由不是程序员的人编辑。当然,我也需要做相反的事情来更新字段,但我认为这更直接。

这是在MySQL甚至可能或将不得不使用脚本语言来实现这一目标吗?

任何帮助非常感谢。

+0

你需要使用子查询此 - 我是不是在工作中有更多的时间我会发布它,但我确定无论如何别人会对我负责。 – 2012-01-31 15:45:58

+0

今天发生了什么? http://stackoverflow.com/questions/9082139/how-to-use-in-clause-in-subquery#comment11402970_9082139 – danihp 2012-01-31 16:03:08

回答

1
SELECT a.ID, a.title, c.keyword 
FROM `Article` a INNER JOIN `Article_keywords` b 
      ON a.id = b.article_id 
     INNER JOIN `Keywords` c 
      ON b.keyword_ID = c.id 

或者如果你想有一个单独的行,每个标题

SELECT a.ID, a.title, GROUP_CONCAT(c.keyword) `keyword` 
FROM `Article` a INNER JOIN `Article_keywords` b 
      ON a.id = b.article_id 
     INNER JOIN `Keywords` c 
      ON b.keyword_ID = c.id 
GROUP BY a.ID 
+0

两个优秀的答案。谢谢。 – 2012-01-31 16:19:06

0

这是在MySQL甚至可能或将不得不使用脚本语言来实现这一目标吗?

你不认为非程序员可以直接在mysql控制台或phpmyadmin中编辑数据吗?

很明显,您需要为此创建一个页面(例如在PHP中)。

用于选择包含所有关键字的页面的SQL非常简单。我相信你知道这一点。所以,去买一本关于PHP的书并开始构建这个页面。

0
select article.id, article.title, 
group_concat(keyword.keyword) keywords 
from article inner join article_keyword on article_id=article.id 
inner join keyword on keyword_id=keyword.id 
group by article.id,article.title