2012-04-27 65 views
1

我有一個像魅力一樣的查詢,但現在我需要通過一個當前處於GROUP_CONCAT創建字段中的值進行過濾。我已經瞭解到,我可以使用HAVING過濾,但我找不到要使用的語法HAVING groupconcatname LIKE '%6%'會發現6,16,26等。我需要聲明搜索特定值,以便它可以找到「8 「在包含1,5,8,18,30,58的groupconcat中,因爲我使用了LIKE'%%',所以找不到8 AND 18 AND 58MySQL HAVING GROUP_CONCAT中的具體編號

我查詢(工程現在..但發現的基礎上%6%部分匹配的結果太多):

SELECT offers.*, s.short_name AS sponsorName, s.logo AS sponsorLogo, GROUP_CONCAT(mn.title) titles, 
    GROUP_CONCAT(mo.`name`) metas, GROUP_CONCAT(om.meta_option) AS meta_ids 
FROM offers 
INNER JOIN offer_metas as om ON om.offer_id = local_ld_offers.id 
INNER JOIN meta_options as mo ON om.meta_option = mo.id 
INNER JOIN meta_names as mn ON mo.category = mn.category AND mo.cat_seq = mn.seq 
LEFT JOIN sponsors AS s ON s.id=offers.sponsor 
GROUP BY offers.id 
HAVING meta_ids LIKE '%6%' 
ORDER BY end_date ASC 

我需要更換HAVING meta_ids LIKE '%6%'的東西更像是WHERE '6' IN meta_ids但是當我嘗試以取代HAVING聲明,似乎是一個合理的嘗試在運作其中,它忽略的事實,meta_ids是一個有效的變量/字段在我的子句中使用和出錯。

有什麼建議嗎?

感謝,

銀虎

UPDATE - 解決除非是基於托馬斯的建議,下面我已經更新了查詢更優雅的方式

,顯然我可以搜索儘可能多的個人價值,因爲我需要通過使用更新的方法添加每個選項的行如下:

WHERE EXISTS(SELECT * FROM offer_metas AS om1 WHERE om1.meta_option = mo.id AND om1.meta_option = '23') 
OR EXISTS(SELECT * FROM offer_metas AS om1 WHERE om1.meta_option = mo.id AND om1.meta_option = '16') 

回答

2

目前尚不清楚這裏提出的是什麼(一些測試輸入和預期輸出會有所幫助),但聽起來並不像你真的需要Having條款。如果您要篩選值,其中說om.meta_option是「喜歡」 8,然後添加一個Where子句,像這樣:

Where Exists (
       Select 1 
       From meta_options As om1 
       Where om1.meta_option = mo.id 
        And om1.meta_option = Like '%8%' 
       ) 

當然,這裏存在88018181這回行。如果您正在尋找等於8一個特定的值,然後使用:

Where Exists (
       Select 1 
       From meta_options As om1 
       Where om1.meta_option = mo.id 
        And om1.meta_option = '8' 
       ) 

如果你想尋找的是一系列的值,那麼你可以這樣做:

Where Exists (
       Select 1 
       From meta_options As om1 
       Where om1.meta_option = mo.id 
        And om1.meta_option In('8','23') 
       ) 

記住這樣做的目的的Having子句在之後應用過濾器,分組和Where子句在分組之前應用過濾器。在這種情況下,這聽起來像過濾應該發生在分組之前,因此應該使用Where子句。

+0

問題是om.meta_option是一個可能字段(因此使用GROUP_CONCAT的必要條件)。我無法直接查詢om.meta_option,因爲它不會是相對結果,也不會正確返回其他已連接的表dat。我需要在group_concat中搜索和過濾/匹配,以確保正確的結果。 – Silvertiger 2012-04-27 05:40:36

+0

@Silvertiger - 我寫的Exists子句說明了其他文件,因爲連接過濾掉了除Exists子句之外應該考慮的meta_options行。不過,如果您擔心這一點,您可以簡單地展開Exists子句。 – Thomas 2012-04-27 05:46:41

+0

@Silvertiger - 請記住Having子句的效果就是說'8'例如存在於group_concat結果中的某處。我寫的存在子句也是這樣做的。 – Thomas 2012-04-27 05:48:19

0

您可以將HAVING meta_ids LIKE '%6%'更改爲HAVING meta_ids LIKE '%,6,%' OR '6,%' OR '%,6' OR '6',這應該會得到您要查找的內容。

替代選項包括像子查詢之類的東西,就像%運算符不是很好的性能明智。

+0

是啊..但是,自從你找到「6,」,「26」,以及「,68」等之後,「就像'%6%'一樣......這會使情況更加惡化。 – Silvertiger 2012-04-27 04:03:51

+0

額外的情況下,確保它們是:(6在其他數字之間)或(6作爲開始)或(6作爲結束)或(6自己) – hkf 2012-04-27 04:04:57

+0

不知道您是否實際上嘗試過我的解決方案,因爲它解決了meta_ids中'6'的可能性的所有情況。 – hkf 2012-04-27 07:13:50