MYSQL查询仅限于一个枚举类型,不包括其他枚举

时间:2014-03-10 18:45:51

标签: mysql sql

我无法绕过查询。

我的表格结构如下:

submitted_name   type             user_submitted_id   submitted_id
Red              manager          1                       10
Red              sales            1                       11
Red              IT               1                       12
Green            IT               2                       13
Green            sales            2                       14
Blue             sales            3                       15
Yellow           sales            4                       16
Aqua Blue        manager          1                       17
Lime Green       manager          1                       18
Lime Green       sales            1                       19

我将如何编写我的查询,该查询仅显示仅具有“sales”类型且没有其他类型的submitted_names。类型是enum数据类型。名称不是唯一的。

submitted_name不是索引列,此数据库有大约1500万行。

所以给定这个测试数据,结果应该是

`blue | sales | 2`
'Yellow | sales | 4'

我已经尝试过做一些区别和分组,但仍然在如何构建这个问题上留下空白。我知道这不是最复杂的问题,但是因为我已经完成了SQL查询并且无法找到最好的“谷歌搜索”方法,所以已经有一段时间了。

2 个答案:

答案 0 :(得分:2)

SELECT t1.* FROM my_table t1
   LEFT JOIN my_table t2
      ON t1.submitted_name = t2.submitted_name AND t1.type != t2.type
   WHERE t1.type='sales' AND t2.type IS NULL

这会查找my_tabletype=sales的所有记录,其中submitted_name的记录不存在type

编辑:替代方法:

SELECT submitted_name,GROUP_CONCAT(`type`) AS `type`,GROUP_CONCAT(`id`) AS `id`
FROM my_table
GROUP BY submitted_name
HAVING `type`='sales'

它的作用是 - 记录所有记录并按submitted_name对它们进行分组,然后将它们过滤为仅具有单一类型“sales”的记录。

我不能保证,鉴于你的桌子大小(或者甚至根本没有任何提升,你将获得巨大的性能提升,因为无论如何都会在你的12M记录表上进行全扫描),但至少不会加入。

EDIT2:鉴于新信息,使用索引列(user_submitted_id)代替submitted_name加入/分组,绝对是一个好主意。场景。

第一个查询将如下所示:

SELECT t1.* FROM my_table t1
   LEFT JOIN my_table t2
      ON t1.user_submitted_id = t2.user_submitted_id AND t1.type != t2.type
   WHERE t1.type='sales' AND t2.type IS NULL

NB :请注意,最好在此查询中指定确切的列而不是t.*,这样可以减少结果集的内存消耗,从而提高性能增益。

第二个查询将如下所示:

SELECT submitted_name,GROUP_CONCAT(`type`) AS `type`,GROUP_CONCAT(`id`) AS `id`
FROM my_table
GROUP BY user_submitted_id
HAVING `type`='sales'

答案 1 :(得分:0)

试试这个

select * 
    from table_name
    where  submitted_name in (select distinct(submitted_name)  from table_name
        minus
        select distinct(submitted_name) from table_name where type<>sales)