2012-01-31 65 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