本文介绍了尝试匹配GROUP_CONCAT中的多个值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

查询

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

可以说用户希望所有具有选项"drink"和选项"bath"的对象.所以我只会得到这个结果.

Lets say the user want all objects that has option "drink" AND option "bath". So i only get this result.

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

我如何编辑查询才能获得此结果?

How do i have to edit the query to get this result?

推荐答案

最简单的方法: 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方式进行查询,请不要依赖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;

这篇关于尝试匹配GROUP_CONCAT中的多个值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-29 11:07