Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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 查询以从SQL中删除重复项_Mysql_Sql_Duplicates_Distinct - Fatal编程技术网

Mysql 查询以从SQL中删除重复项

Mysql 查询以从SQL中删除重复项,mysql,sql,duplicates,distinct,Mysql,Sql,Duplicates,Distinct,我在桌子上有一个名字叫“距离”。它有4列id、起点、终点和距离 我有一些重复的记录。在某种意义上,重复记录 start_from | end_to | distance Chennai Bangalore 350 Bangalore Chennai 350 Chennai Hyderabad 500 Hyderabad Chennai 510 在上表中,钦奈到班加罗尔和班加罗尔到钦奈都有相同的

我在桌子上有一个名字叫“距离”。它有4列id、起点、终点和距离

我有一些重复的记录。在某种意义上,重复记录

start_from   |   end_to    | distance
Chennai        Bangalore     350
Bangalore      Chennai       350
Chennai        Hyderabad     500
Hyderabad      Chennai       510
在上表中,钦奈到班加罗尔班加罗尔到钦奈都有相同的距离。因此,我需要查询以删除选择上的记录

我想要一个像

start_from   |   end_to    | distance
Chennai        Bangalore     350
Chennai        Hyderabad     500
Hyderabad      Chennai       510
在查询中设置字段顺序(使用值)有助于获得唯一的行:

select distinct
    case when start_from  > end_to then end_to     else  start_from end as _start,
    case when start_from  > end_to then start_from else  end_to     end as _end,
    distance
from distance;
经过测试,我得到:

+-----------+-----------+----------+
| _start    | _end      | distance |
+-----------+-----------+----------+
| Bangalore | Chennai   |      350 |
| Chennai   | Hyderabad |      500 |
| Chennai   | Hyderabad |      510 |
+-----------+-----------+----------+

您可以使用以下查询查找重复项:

SELECT LEAST(start_from, end_to) AS start_from, 
       GREATEST(start_from, end_to) AS end_to, 
       distance
FROM mytable 
GROUP BY LEAST(start_from, end_to), GREATEST(start_from, end_to), distance
HAVING COUNT(*) > 1
SELECT t1.*
FROM mytable AS t1
LEFT JOIN (
    SELECT LEAST(start_from, end_to) AS start_from, 
           GREATEST(start_from, end_to) AS end_to, 
           distance
    FROM mytable 
    GROUP BY LEAST(start_from, end_to), GREATEST(start_from, end_to), distance
    HAVING COUNT(*) > 1
) AS t2 ON t1.start_from = t2.start_from AND 
           t1.end_to = t2.end_to AND 
           t1.distance = t2.distance    
WHERE t2.start_from IS NULL
输出:

start_from,   end_to,  distance
--------------------------------
Bangalore,    Chennai, 350
start_from  end_to     distance
--------------------------------
Chennai     Bangalore  350
Chennai     Hyderabad  500
Hyderabad   Chennai    510
现在,您可以使用上述查询作为派生表来筛选重复项:

SELECT LEAST(start_from, end_to) AS start_from, 
       GREATEST(start_from, end_to) AS end_to, 
       distance
FROM mytable 
GROUP BY LEAST(start_from, end_to), GREATEST(start_from, end_to), distance
HAVING COUNT(*) > 1
SELECT t1.*
FROM mytable AS t1
LEFT JOIN (
    SELECT LEAST(start_from, end_to) AS start_from, 
           GREATEST(start_from, end_to) AS end_to, 
           distance
    FROM mytable 
    GROUP BY LEAST(start_from, end_to), GREATEST(start_from, end_to), distance
    HAVING COUNT(*) > 1
) AS t2 ON t1.start_from = t2.start_from AND 
           t1.end_to = t2.end_to AND 
           t1.distance = t2.distance    
WHERE t2.start_from IS NULL
WHERE
子句谓词
t2.start\u from为NULL
,过滤掉重复记录

输出:

start_from,   end_to,  distance
--------------------------------
Bangalore,    Chennai, 350
start_from  end_to     distance
--------------------------------
Chennai     Bangalore  350
Chennai     Hyderabad  500
Hyderabad   Chennai    510
摆出你的桌子

id  start_from              end_to                  distance
0   Chennai                 Bangalore               350
1   Bangalore               Chennai                 350
2   Chennai                 Hyderabad               500
3   Hyderabad               Chennai                 510
然后可以使用查询compare with id

Select 
    O.start_from,
    O.end_to,
    O.distance 
From 
    distance O
Left Join
    distance P
On 
    1 = 1
    and O.start_from = P.end_to 
    and O.end_to = P.start_from
Where 
    1 = 1
    and O.distance <> P.distance 
    or(O.distance = P.distance and O.id < P.id)
选择
从……开始,
O.结束,
O.距离
从…起
距离O
左连接
距离P
在…上
1 = 1
和O.start\u from=P.end\u to
O.end_to=P.start_from
哪里
1 = 1
和O.distance P.distance
或(O.distance=P.distance,O.id
如果
钦奈到班加罗尔
班加罗尔到钦奈
之间没有区别,您可以尝试以下方法:

select
    max(`start_from`) as `start_from`,
    min(`end_to`) as `end_to`,
    `distance`
from yourtable
group by
    case when `start_from` > `end_to` then `end_to` else `start_from` end,
    case when `start_from` > `end_to` then `start_from` else `end_to` end,
    `distance`
这是一个在线测试仪

即使是从钦奈到海得拉巴也可以

如果您想保留从班加罗尔到钦奈的
max
min
的位置:

select
    min(`start_from`) as `start_from`,
    max(`end_to`) as `end_to`,
    `distance`
from yourtable
group by
    case when `start_from` > `end_to` then `end_to` else `start_from` end,
    case when `start_from` > `end_to` then `start_from` else `end_to` end,
    `distance`
也是一个


当将与大多数数据库兼容时,
将与大多数数据库兼容。

请共享确切的所需输出。字段值可能重复,但根据需要,我们需要重写查询或重新设计表。@Saurabhjhunjhunla添加了所需的输出。我不能换桌子。你为什么要金奈去班加罗尔,而不是班加罗尔去金奈?如果钦奈到海得拉巴也是350,你想要什么?钦奈到海得拉巴是不同的起点和终点。所以我不想删除这一行。那你为什么选择留在金奈到班加罗尔,而不是班加罗尔到金奈?但最后一行应该是
海得拉巴,金奈,510
是的,很好,使用值对字段排序,然后过滤唯一的记录。但正如@Ullas在changedYep中提到的start_,你是对的。使用case和
case
vs
JOIN
时效果更好。情况更好。因此最好使用
CASE