我如何 select 来自多列的唯一值(每个值都是唯一的而不是总行)

How do I select unique values from multiple columns (each value being unique not the total row)

我有一个现有的 table,它有很多行,如下所示:

id Product Tel1 Tel2 Tel3 Tel4
1 A 1234 1234 1234 1234
2 B 1234 1234 1234 3750
3 C 1234 1235 1234 1234
4 D 1234 1234 1234 1234
5 E 9876 1234 3654 6583
6 F 1234 4567 1234 1234
6 G 9876 1234 1234 2785
7 etc... 1234 1234 1234 1234

还有其他列,但这演示了此问题的重要列。

它被用作php前端的一种telephone目录,许多号码是相同的,特别是对于类似的产品。我需要创建一个新的 table,我可以在前端显示关于每个数字的一​​些额外信息,而当前的 table 很长,总共有很多 phone 个数字所以我手动查看它并找到我想放入新的 table.

中的所有数字是不切实际的

我需要 运行 某种 select 查询来获取当前 table 具有的所有 phone 数字列中所有唯一数字的列表.这只是一个一次性查询,可以让我获得一个列表,然后我可以用它创建一个新的 table,所以我不关心查询效率。

结果应如下所示:

numbers
1234
0987
3654
9876
etc...

只是列出所有唯一号码。然后我可以获取这些数据并将其放入这个新的 table 并开始自己添加其他列以获取我提到的其他信息,然后只需使用一个典型的查询来在我的前端显示这些额外数据,当其中一个数字出现时来自原始 table 的 select 由用户编辑,在我的新 table.

中使用 phone 号码作为 ID

我已经尝试寻找解决方案并且我已经知道 DISTINCT 命令,但我对此的理解是它只会产生每列不相同的结果列表,这不是我想要的,这是我似乎从我的关键字中获得的搜索结果。

一旦我有了一个唯一的列表并且我不必手动查看原始的大 table 来获取它们,我就可以手动创建新的 table 并手动插入所有手动唯一编号,但如果我还可以以某种方式组合查询以插入到我创建的新 table 中,则可以加分。 (如果这甚至可能?)

编辑:对于那些提到规范化的人,虽然我原则上不反对,但我不能以任何方式改变现有的 table,因为它与我的第三方软件保持同步没有直接控制权,因此它必须保留在当前模式中。我可以用其他 table 做任何我喜欢的事,但我不能碰原始的 table,所以我仍然可以使用 phpmyadmin 来用从这个其他软件中获取的新版本覆盖它将来。

根据您的示例,您可以使用 select 并集,每个列需要一个 select

select tel1 
from my_table
union 
select tel2
from my_table
union
select tel3
from my_table
union 
select tel4
from my_table

然后您可以使用创建 select

创建 table
create table my_new_table 
select tel1 tel
from my_table
union 
select tel2
from my_table
union
select tel3
from my_table
union 
select tel4
from my_table

假设table名字是products,你可以使用下面的查询

select tel1 as numbers from products
union
select tel2 from products
union
select tel3 from products
union
select tel4 from products;

它将输出以下内容:

numbers
1234
9876
1235
1001
1111
3750
2785

View on DB Fiddle

强制性 PSA:

  • 请在创建新 table 时规范化 table 以使生活更轻松。

我会执行查询并集以按列获取所有不同的电话,然后对该电话并集执行查询以仅获取一次:

SELECT DISTINCT `Tel` FROM
( 
  SELECT DISTINCT `Tel1` AS `Tel` FROM products
  UNION
  SELECT DISTINCT `Tel2` AS `Tel` FROM products
  UNION
  SELECT DISTINCT `Tel3` AS `Tel` FROM products
  UNION
  SELECT DISTINCT `Tel4` AS `Tel` FROM products
) all_telephones