2012-08-07 62 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