Mysql连续获取多对多关系数据

时间:2012-01-31 15:44:08

标签: mysql many-to-many

嗨,我有一个看似简单的问题,导致我的头受伤。

我在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中是否可行,或者必须使用脚本语言来实现这一目标?

任何帮助非常感谢。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

  

这在MySQL中是否可行,或者必须使用脚本语言来实现这一目标?

您认为非程序员不能直接在mysql控制台或phpmyadmin中编辑数据,是吗?

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

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

答案 2 :(得分: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