2013-07-30 52 views
2

說例如,我有一個帶標籤的簡單Blog。我有一個Blog表格,一個Tag表格和一個TagRelation表格。我想運行一個查詢,並獲取每個博客帖子在其單個行中的所有相關數據,包括標籤。將所有查詢結果分組到單個行中

SELECT Tag.id AS 'Tag.id', Tag.name AS 'Tag.name', Blog.id AS 'Blog.id', Blog.author AS 'Blog.author', Blog.title AS 'Blog.title', Blog.content AS 'Blog.content' 
FROM Blog 
INNER JOIN TagRelation ON TagRelation.target = Blog.id 
INNER JOIN Tag ON Tag.id = TagRelation.Tag 
WHERE Blog.id = '101' 

該查詢會給我一個排的每個標籤,每個相同的博客文章數據後ID 101,並加入GROUP BY Blog.id會給我只有一排,但無論是任意第一標籤結果。

我想是這樣的:

Blog.id | Blog.author | Blog.title | Blog.content | Tag.id | Tag.name | Tag.id | Tag.name 
----------------------------------------------------------------------------------------- 
101  | someone  | something | lolstuff  | 1  | tag1  | 2  | tag2 

所以,我的客戶端代碼可以很容易地解析成的對象。這可能在MySQL中,而不處理同一博客ID的多個匹配的行或進行子查詢只是爲了獲得每個職位的標籤? (實際的數據庫,當然是更大,比這更復雜,我想要做的儘可能多的加入成爲可能。)

+1

你不能在一般情況下這樣做(假設給定博客文章中有任意數量的標籤)。但是,在應用程序代碼中迭代列而不是行會更容易嗎? – RandomSeed

回答

1

接近的解決方案涉及使用GROUP_CONCAT()

SELECT 
    GROUP_CONCAT(Tag.id SEPARATOR ',') AS 'Tag.ids', 
    GROUP_CONCAT(Tag.name SEPARATOR ',') AS 'Tag.names', 
    Blog.id, Blog.author, Blog.title, Blog.content 
FROM Blog 
INNER JOIN TagRelation ON TagRelation.target = Blog.id 
INNER JOIN Tag ON Tag.id = TagRelation.Tag 
WHERE Blog.id = '101' 
GROUP BY Blog.id 

這導致分別在Tag.idsTag.names列中的對應的Tag.idTag.name的兩個彗形分離的列表。

但是,如果在應用程序代碼中迭代列(或者在這種情況下是逗號分隔的值),而不是應用程序代碼中的行,是否會更容易些?

+0

我忘了在我的帖子中提到這個。你是對的,我可以用group_concat完成它,遍歷字符串,或者對每個博客帖子運行第二個查詢來獲取標籤並遍歷它,但我在這裏尋找更聰明/優雅/更快的解決方案。 – pettazz