我无法绕过查询。
我的表格结构如下:
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查询并且无法找到最好的“谷歌搜索”方法,所以已经有一段时间了。
答案 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_table
中type=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)