Mysql 具有自引用条件的自联接
我想做的是获取所有几乎完全相同的记录,除了重复项在“name”开头没有额外的字符 这是我的sql查询:Mysql 具有自引用条件的自联接,mysql,sql,join,Mysql,Sql,Join,我想做的是获取所有几乎完全相同的记录,除了重复项在“name”开头没有额外的字符 这是我的sql查询: select * from tags as spaced inner join tags as not_spaced on not_spaced.name = substring(spaced.name, 2); 我也试过: select * from tags as spaced where (select count(*) from tags as not_spaced where n
select * from tags as spaced inner join tags as not_spaced on not_spaced.name = substring(spaced.name, 2);
我也试过:
select * from tags as spaced where (select count(*) from tags as not_spaced where not_spaced.name = substring(spaced.name, 2)) > 0;
我得到的是。。。SQL连接停止响应。
谢谢
p、 很抱歉,我没有提到我需要的唯一字段是name。所有其他字段都不重要(如果存在)。如果表格非常大,请在
name
和子字符串(name,2)
上创建索引
:
select t1.* from tags t1
inner join tags t2 on t1.name = substring(t2.name, 2)
如果表非常大,请在
名称
和子字符串(名称,2)
上创建一个索引
,使其更快:
select t1.* from tags t1
inner join tags t2 on t1.name = substring(t2.name, 2)
即使使用索引,您的查询也需要根据
标记中的每条记录检查间隔中的每条记录
如果每个表有1000条记录,那就是1000000个组合
您最好创建一个临时表,其中只有两个字段spaced.id,子字符串(t2.name,2)作为shortname
,然后为shortname字段编制索引。加入临时和索引表会快得多。即使有索引,您的查询也需要根据标记中的每条记录检查间隔中的每条记录
如果每个表有1000条记录,那就是1000000个组合
您最好创建一个临时表,其中只有两个字段spaced.id,子字符串(t2.name,2)作为shortname
,然后为shortname字段编制索引。加入临时和索引表会快得多。在不知道数据库、表是如何索引的情况下,它只是尝试不同的事情,直到得到更好的优化
以下是您可以尝试的另一个查询:
SELECT name, count(*) c FROM (
SELECT name FROM tags
UNION ALL
SELECT substring(name, 2) AS name FROM tags
) AS t
GROUP BY name
在不知道数据库、表如何索引等的情况下,它只是尝试不同的事情,直到一个得到更好的优化
以下是您可以尝试的另一个查询:
SELECT name, count(*) c FROM (
SELECT name FROM tags
UNION ALL
SELECT substring(name, 2) AS name FROM tags
) AS t
GROUP BY name
试着这样做:
选择
除
名称、名称
from tags union all
from tags
选择所有可能重复的字段,子字符串(名称,2)名称除外
from tags union all
from tags
分组依据
所有可能重复的字段包括名称
试着这样做:
选择
除
名称
、名称
from tags union all
from tags
选择所有可能重复的字段,子字符串(名称,2)名称除外
from tags union all
from tags
分组依据
所有可能重复的字段包括名称
您的表有多大?您使用的数据库是什么?自连接可能非常耗时…它是库存mysql,表有21269条记录,所以,我应该等一下吗?我是sql新手,所以您能告诉我查询是构造错误还是太重吗?您的表有多大,您使用的数据库是什么?自连接可能非常耗时…它是库存mysql,表有21269条记录,所以,我应该等待吗?我是sql新手,所以你能告诉我查询是否构造错误或只是“重”?OP不是这样查询逻辑,OP是查询为什么<代码>SQL连接停止响应。
@Dems:阅读他写的内容:“我想做什么…”。连接停止响应,因为查询时间太长,这是显而易见的。@Dems我的答案中有一个解决方案(索引
),很好!假设OP的SQL品牌将允许该索引:)OP不是查询逻辑本身,而是查询为什么<代码>SQL连接停止响应。
@Dems:阅读他写的内容:“我想做什么…”。连接停止响应,因为查询时间太长,这是显而易见的。@Dems我的答案中有一个解决方案(索引
),很好!假设OP品牌的SQL允许索引:)包含21269条记录,它将处理452370361个比较。对于索引的临时保留表,它将是21269个索引查找。对于21269个记录,它将处理452370361个比较。有了索引的临时保留表,它将是21269索引。