2011-03-08 354 views
5

我有以下查詢的問題(如果這是一個重複的問題,那麼我很抱歉,但我似乎無法找到任何東西,可以幫助我):MySQL的GROUP_CONCAT在

SELECT d.*, GROUP_CONCAT(g.name ORDER BY g.name SEPARATOR ", ") AS members 
FROM table_d AS d LEFT OUTER JOIN table_g AS g ON (d.eventid = g.id) 
WHERE members LIKE '%p%'; 

MySQL顯然無法在WHERE子句中處理GROUP_CONCAT列的比較。 所以我的問題很簡單。有沒有解決方法,就像使用子查詢或類似的東西?我真的需要這段代碼才能工作,除了在查詢本身中處理這些內容外,沒有別的選擇可供使用。

編輯1:

我不會讓實際的代碼,因爲這可能是機密,我得請與我同行。無論如何,我只是寫了這段代碼給你一個關於這個陳述看起來如何的印象,儘管我同意你的看法,這並沒有多大意義。我將在一分鐘內查看下面的答案,然後我會再回復你。再次thnx所有的幫助已經!

編輯2:使用HAVING

嘗試過,但只有當我不使用GROUP BY工作。當我嘗試它時,它給我一個語法錯誤,但是當我刪除GROUP BY時,查詢完美地工作。事情是,我需要GROUP BY,否則查詢將對我毫無意義。

編輯3:

好了,我犯了一個愚蠢的錯誤,並把HAVINGGROUP BY,這顯然是行不通的了。感謝所有幫助,它現在可以工作!

+0

'g.name like'%peter%''有什麼問題? – ajreal 2011-03-08 14:13:17

回答

12

使用HAVING而不是WHERE

... HAVING members LIKE '%peter%' 

WHERE施加GROUP_CONCAT求值之前的過濾器; HAVING稍後應用。

編輯:我發現你的查詢有點混亂。它看起來只會在單個字符串中獲得所有名稱的唯一一行 - 除非數據庫中沒有人名爲Peter,否則查詢將不會返回任何內容。

也許HAVING是不是真的,你在這裏需要什麼...

+0

優秀的答案! – BigFatBaby 2011-03-08 14:16:53

+1

@dnagirl:group_concat在select中已經有一個別名...它是'members',所以@awm是完全正確的。 – BigFatBaby 2011-03-08 14:22:58

+0

你肯定**可以**在一個having子句中使用別名。嘗試一下! – awm 2011-03-08 14:30:06

2

嘗試

SELECT ... 
... 
WHERE g.name = 'peter' 

代替。由於您只是進行簡單的名稱查找,因此無需搜索派生字段 - 只需匹配底層原始字段即可。

0

GROUP_CONCAT是一個聚合函數。你必須GROUP BY something。如果你只想要所有在其中有%peter%的行,試試

SELECT d.*, g.name 
FROM table_d AS d 
    LEFT OUTER JOIN table_g AS g 
    ON (d.eventid = g.id) 
WHERE g.name LIKE '%peter%'; 
+0

之後,這不完全正確。是的 - 'GROUP_CONCAT'是一個聚合函數,但不是 - 你不需要'GROUP BY'的東西。如果沒有給出「GROUP BY」語句,MySQL會將所有結果集合分組到相同的組中,這可能是所期望的效果。 – BigFatBaby 2011-03-08 14:20:55