2012-02-13 153 views
1

我現在有數據庫設置像這樣:GROUP_CONCAT或替代結果

CREATE TABLE `article` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `title` int(11) NOT NULL, 
    `body` int(11) NOT NULL, 
    `link` int(11) NOT NULL, 
    `date` datetime NOT NULL, 
    PRIMARY KEY (`id`) 
) 

CREATE TABLE `translation_pivot` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `content` text, 
    PRIMARY KEY (`id`) 
) 

這是一個相當簡化的版本來說明問題,本質上是translation_pivot用於進一步查找文本字符串來自一系列語言表,但這不相關。這裏,article中的title,bodylink列包含來自translation_pivot的引用content的id。

難點在於做一個INNER JOIN會產生一個名爲content的列,它將只包含來自translation_pivot的第一個匹配,在這種情況下爲title

我看過的其他選項是使用translation_pivot.content上的GROUP_CONCAT。這將工作,但隨後我留下一個用逗號分隔的項目列表,並且與第一項,第二項和第三項(這是可以的,但不是很好的)不同,它與title,bodylink之間的關係明顯失去。更嚴重的問題是,翻譯中的項目可能是幾段文字。 group_concat_max_len的默認值是1024,我可以更改它,但是如果設置爲高值,會不會影響性能?

理想我想從translation_pivot與文本結果更換titlebodylink列,或至少得到的文本內容回針對每個作爲一個單獨的列的方式。這可能在一個單一的查詢?

我的另一種方法是以翻譯_pivot的id作爲鍵值,將鍵值對作爲數組檢索,然後在查詢文章後進行查找。這只是一個額外的查詢,可能更簡單一些。

哪種解決方案最適合放大?還是有什麼我失蹤?

回答

2

只是做多的加入:

SELECT 
    article.id AS id, 
    tptitle.content AS title, 
    tpbody.content AS body, 
    tplink.content AS link, 
    article.`date` AS `date` 
FROM 
    article 
    INNER jOIN translation_pivot AS tptitle ON article.title=tptitle.id 
    INNER jOIN translation_pivot AS tpbody ON article.body=tpbody.id 
    INNER jOIN translation_pivot AS tplink ON article.link=tplink.id 

或:

SELECT 
    article.id AS id, 
    IFNULL(tptitle.content,'DEFAULT TITLE') AS title, 
    IFNULL(tpbody.content, 'DEFAULT BODY') AS body, 
    IFNULL(tplink.content, 'DEFAULT LINK') AS link, 
    article.`date` AS `date` 
FROM 
    article 
    LEFT jOIN translation_pivot AS tptitle ON article.title=tptitle.id 
    LEFT jOIN translation_pivot AS tpbody ON article.body=tpbody.id 
    LEFT jOIN translation_pivot AS tplink ON article.link=tplink.id 
+0

+1瞬間!但是,不確定是否總會有標題,正文和鏈接值填充。 – 2012-02-13 15:09:04

+0

在這種情況下,你需要一個左連接而不是內連接,編輯我的答案 – 2012-02-13 15:11:47

+0

啊,我剛剛看到你的回答:快回來! +1 – 2012-02-13 15:13:37

2

鏈接到translation_pivot表中的每個標題,正文和紐帶 - 像這樣:

select a.`id`, 
     a.`date`, 
     t.`content` title_content, 
     b.`content` body_content, 
     l.`content` link_content 
from `article` a 
left join `translation_pivot` t on a.`title` = t.`id` 
left join `translation_pivot` b on a.`body` = b.`id` 
left join `translation_pivot` l on a.`link` = l.`id`