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

问题:

  1. 它似乎返回了我的 table 中的每一行。
  2. 它不会在单个列中找到重复项。

如何将所有 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)