Select 行具有可能位于不同列中的重复值
Select rows with duplicate values that may be in different columns
我有 table 个商家,每个商家最多可以有 3 个 phone 个号码。我想找到任何重复的 phone 数字,但由于 phone 数字位于不同的列中,我认为我无法使经典的 GROUP BY
查询正常工作。
示例数据:
ID
Business_Name
phone_main
phone_mobile
phone_tollfree
1
John's Donuts
555-551-5555
555-551-5556
null
2
John's Bakery
555-551-5557
555-551-5555
null
3
SuperBake!
555-300-1005
null
555-551-5555
4
Grocery Fred
555-223-5511
555-334-5555
null
在这种情况下,我想将记录 1、2 和 3 标识为相同。只需将 phone 号码 555-551-5555 识别为重复的号码就可以了,因为我可以执行子查询,或者调用程序可以使用 phone 号码并发送一个新查询来获取所有记录555-551-5555 在任何 3 phone 列中。
如果重要的话,这在 MariaDB 上。
编辑,(添加我当前的失败尝试,因为有人似乎真的想要它):
这是我现在拥有的:
SELECT ID, phone_main, phone_mobile, phone_tollfree
(
SELECT COUNT(*) FROM businesses b
WHERE (
phone IS NOT NULL AND (b.phone_mobile=phone OR b.tollfree=phone )
)
OR (
phone_mobile IS NOT NULL AND (b.phone=phone_mobile OR b.phone_tollfree=phone_mobile)
)
OR (
phone_tollfree IS NOT NULL AND (b.phone=phone_tollfree OR b.phone_mobile=phone_tollfree)
)
) cnt
from business HAVING cnt > 1
问题:
- 它似乎返回了我的 table 中的每一行。
- 它不会在单个列中找到重复项。
如何将所有 phone 列合并为一个,然后计算重复出现的次数?
我没有运行代码,但它可能会给你一个方向...:[=11=]
SELECT phone, COUNT(phone)
FROM (
SELECT phone_main as phone FROM SampleData
UNION ALL
(SELECT phone_mobile as phone FROM SampleData
ORDER BY City;
UNION ALL
SELECT phone_tollfree as phone FROM SampleData
ORDER BY City; and )
)
GROUP BY phone
w=12=WILL.y.:w=11=w
w=10=sh
你可以这样做:
with
l as (
select *, least(phone_main, phone_mobile, phone_tollfree) as p
from t
)
select *
from l
where p in (select p from l group by p having count(*) > 1)
我有 table 个商家,每个商家最多可以有 3 个 phone 个号码。我想找到任何重复的 phone 数字,但由于 phone 数字位于不同的列中,我认为我无法使经典的 GROUP BY
查询正常工作。
示例数据:
ID | Business_Name | phone_main | phone_mobile | phone_tollfree |
---|---|---|---|---|
1 | John's Donuts | 555-551-5555 | 555-551-5556 | null |
2 | John's Bakery | 555-551-5557 | 555-551-5555 | null |
3 | SuperBake! | 555-300-1005 | null | 555-551-5555 |
4 | Grocery Fred | 555-223-5511 | 555-334-5555 | null |
在这种情况下,我想将记录 1、2 和 3 标识为相同。只需将 phone 号码 555-551-5555 识别为重复的号码就可以了,因为我可以执行子查询,或者调用程序可以使用 phone 号码并发送一个新查询来获取所有记录555-551-5555 在任何 3 phone 列中。
如果重要的话,这在 MariaDB 上。
编辑,(添加我当前的失败尝试,因为有人似乎真的想要它):
这是我现在拥有的:
SELECT ID, phone_main, phone_mobile, phone_tollfree
(
SELECT COUNT(*) FROM businesses b
WHERE (
phone IS NOT NULL AND (b.phone_mobile=phone OR b.tollfree=phone )
)
OR (
phone_mobile IS NOT NULL AND (b.phone=phone_mobile OR b.phone_tollfree=phone_mobile)
)
OR (
phone_tollfree IS NOT NULL AND (b.phone=phone_tollfree OR b.phone_mobile=phone_tollfree)
)
) cnt
from business HAVING cnt > 1
问题:
- 它似乎返回了我的 table 中的每一行。
- 它不会在单个列中找到重复项。
如何将所有 phone 列合并为一个,然后计算重复出现的次数?
我没有运行代码,但它可能会给你一个方向...:[=11=]
SELECT phone, COUNT(phone)
FROM (
SELECT phone_main as phone FROM SampleData
UNION ALL
(SELECT phone_mobile as phone FROM SampleData
ORDER BY City;
UNION ALL
SELECT phone_tollfree as phone FROM SampleData
ORDER BY City; and )
)
GROUP BY phone
你可以这样做:
with
l as (
select *, least(phone_main, phone_mobile, phone_tollfree) as p
from t
)
select *
from l
where p in (select p from l group by p having count(*) > 1)