我有一個像魅力一樣的查詢,但現在我需要通過一個當前處於GROUP_CONCAT
創建字段中的值進行過濾。我已經瞭解到,我可以使用HAVING過濾,但我找不到要使用的語法HAVING groupconcatname LIKE '%6%'
會發現6,16,26等。我需要聲明搜索特定值,以便它可以找到「8 「在包含1,5,8,18,30,58
的groupconcat中,因爲我使用了LIKE'%%',所以找不到8 AND 18 AND 58。MySQL 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')
問題是om.meta_option是一個可能字段(因此使用GROUP_CONCAT的必要條件)。我無法直接查詢om.meta_option,因爲它不會是相對結果,也不會正確返回其他已連接的表dat。我需要在group_concat中搜索和過濾/匹配,以確保正確的結果。 – Silvertiger 2012-04-27 05:40:36
@Silvertiger - 我寫的Exists子句說明了其他文件,因爲連接過濾掉了除Exists子句之外應該考慮的meta_options行。不過,如果您擔心這一點,您可以簡單地展開Exists子句。 – Thomas 2012-04-27 05:46:41
@Silvertiger - 請記住Having子句的效果就是說'8'例如存在於group_concat結果中的某處。我寫的存在子句也是這樣做的。 – Thomas 2012-04-27 05:48:19