Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 具有自引用条件的自联接_Mysql_Sql_Join - Fatal编程技术网

Mysql 具有自引用条件的自联接

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

我想做的是获取所有几乎完全相同的记录,除了重复项在“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 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索引。