将 DISTINCT 与 FIND_IN_SET 一起使用

Posted

技术标签:

【中文标题】将 DISTINCT 与 FIND_IN_SET 一起使用【英文标题】:Using DISTINCT with FIND_IN_SET 【发布时间】:2017-02-16 00:24:59 【问题描述】:

我想同时选择 DISTINCT(p.ptype) 如果 p.ptype 不在 c.ptype 的集合中,我也想获取 c.category

数据库表:p

id   ptype
1    Shirts
2    Cups
3    Shirts
4    Mugs

数据库表:c

id  category  ptype
1   Test      Pants, Shirts, TShirts
2   Test1     Cups, Mats, Rugs

我试过的SQL命令如下

SELECT DISTINCT(p.ptype), IF(FIND_IN_SET(p.ptype, c.ptype), c.category,'') as category
FROM p, c 

这会输出 p.ptype 两次设置。一次是空白的 c.category 字段,一次是填充的 c.category。

但是想要的输出如下

ptype    category
Shirts   Test
Cups     Test1
Mugs

【问题讨论】:

【参考方案1】:

尝试在p 表中的ptype 上执行显式LEFT JOIN,该表出现在c 表的CSV 列表中:

SELECT DISTINCT p.ptype, COALESCE(c.category, '') AS category
FROM p
LEFT JOIN c
    ON FIND_IN_SET(p.ptype, c.ptype) > 0

在您的原始查询中,正在执行交叉联接。这会在两个表的记录之间生成所有可能的组合。使用交叉连接很难得出正确答案,因此最好使用左连接。

演示在这里:

SQLFiddle

【讨论】:

以上是关于将 DISTINCT 与 FIND_IN_SET 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

thinkphp find_in_set 与 replace

impala find_in_set 与性能对比

mysql 中LIKE 与FIND_IN_SET 与关联表left join 速度效率比较

mysql 使用 FIND_IN_SET 来查询数据

mysql中FIND_IN_SET函数的使用

将 DISTINCT 与多个条件聚合一起使用(注释)