2012-08-07 59 views
0
options_table 

options_id | object_id | option_value 
========================================= 
1   | 1  | drink 
2   | 2  | ice 
3   | 1  | bath 
4   | 2  | soda 
5   | 2  | drink 
6   | 3  | ice 
7   | 4  | bath 
8   | 2  | bath 
9   | 1  | storm 


object_table 

object_id | object_name 
============================= 
1   | sun 
2   | moon 
3   | mars 
4   | jupiter 

查詢嘗試匹配是在GROUP_CONCAT多個值

SELECT object_table.object_name GROUP_CONCAT(options_table.option_value) as object_options 
FROM options_table 
LEFT JOIN object_table 
ON object_table.object_id = options_table.object_id  
GROUP BY options_table.object_id 

,所以我得到的結果一樣

object_name | object_options 
========================================= 
moon  | ice, soda, drink, bath 
sun   | drink, bath, storm 
mars  | ice 
jupiter  | bath 

比方說,用戶希望有選擇「喝」的所有對象和選項「洗澡」。所以我只得到這個結果。

object_name | object_options 
========================================= 
moon  | ice, soda, drink, bath 
sun   | drink, bath, storm 

如何編輯查詢以獲得此結果?

+0

你能說'WHERE '喝' 的object_options AND '浴' IN object_options'? – 2012-08-07 12:28:25

+0

當試圖在WHERE – Frankey 2012-08-07 12:34:20

回答

4

最簡單的:http://www.sqlfiddle.com/#!2/1b2e3/5

select obj.object_name, 
    group_concat(opt.option_value order by opt.options_id) as object_options 
from options_table opt 
join object_table obj using(object_id) 
group by obj.object_id 
having sum(opt.option_value in ('drink','bath')) = 2 
order by obj.object_name; 

輸出:

| OBJECT_NAME |  OBJECT_OPTIONS | 
------------------------------------- 
|  moon | ice,soda,drink,bath | 
|   sun | drink,bath,storm | 

如果你想要更多的ANSI-SQL'y方式做查詢,不靠MySQLism(布爾/整數對偶),在SUM上使用顯式值:http://www.sqlfiddle.com/#!1/14cf4/1

select obj.object_name, 
    array_agg(opt.option_value order by opt.options_id) as object_options 
from options_table opt 
join object_table obj using(object_id) 
group by obj.object_id, obj.object_name 
having sum(case when opt.option_value in ('drink','bath') then 1 end) = 2 
order by obj.object_name; 
+0

+1中訪問它時,'object_options'還不存在,這簡單得多:-) – 2012-08-07 12:57:58

+0

太棒了,你讓我的一天!非常感謝! – Frankey 2012-08-07 13:03:44

0

另一種方法:

SELECT object_name, object_options FROM 
    (SELECT object_table.object_name, 
      GROUP_CONCAT(options_table.option_value) as object_options 
    FROM options_table 
    LEFT JOIN object_table 
    ON object_table.object_id = options_table.object_id  
    GROUP BY options_table.object_id) t 
WHERE FIND_IN_SET('drink', object_options)> 0 AND FIND_IN_SET('bath', object_options)> 0 
+0

FIND_IN_SET是一個嚴重的繞道,你可以到達HAVING子句中的元素:-)其實它有一個名字,[stringly-typed](http://www.google.com/search?q=stringly-鍵入+編程#HL = EN&sclient = PSY-AB&q = stringly類型化+程序+ -strongly和OQ = stringly類型化+程序+ -strongly&gs_l = serp.3 ... 4711.7554.0.8750.16.13.3.0.0.0.219.2006.0j12j1.13.0。 ..0.0 ... 1c.hjCEweN09WY&pbx = 1&bav = on.2,or.r_gc.r_pw.r_qf。&fp = b91f5ad55398357e&biw = 1280&bih = 699)編程 – 2012-08-07 13:03:17

+0

@MichaelBuen,我只是提供了另一種方法,就是這樣。我從來沒有說過這個優越。 – 2012-08-07 13:04:36