从所有列中选择唯一到单个列

时间:2012-03-10 01:48:10

标签: php mysql select distinct

我有4列设置,基本上具有相同类型的数据。我想从所有列中所有条目的所有唯一条目创建另一个表。

    C1 (Name1)          C2 (name2)          C3 (name3)
R1  R1 C1 (John)        R1 C2 (Tiny Tim)    R1 C3 (Big Sally)
R2  R2 C1 (Big Sally)   R2 C2 (john)        R2 C3 (Paul)
R3  R3 C1 (Tiny Tim)    R3 C2 (paul)        R3 C3 (rajesh)
R4  R4 C1 (Normal Ned)  R4 C2 (Big Sally)   R4 C3 (Normal Ned)

这就是我需要的

    C1
R1  John
R2  Big Sally
R3  Tiny Tim
R4  Normal Ned
R5  Rajesh
R6  Paul

3 个答案:

答案 0 :(得分:2)

您可以使用UNION关键字。

SELECT c1 FROM table
UNION
SELECT c2 FROM table
UNION
SELECT c3 FROM table;

结果将按照您的要求。

然后只需获取值并将其插入新表或您可以使用 INSERT ... SELECT快速插入。

答案 1 :(得分:2)

尝试以下:

   insert into newtablename
   (
        select distinct  uniquenames from (
            SELECT distinct c1 as uniquenames  FROM tablename
            UNION
            SELECT distinct  c2 as uniquenames  FROM tablename
            UNION
            SELECT distinct  c3 as uniquenames  FROM tablename)
    )

答案 2 :(得分:0)

我能想到的最快的方法如下:

CREATE TABLE c_unique (c1 varchar(100 not null));
ALTER TABLE c_unique ADD UNIQUE INDEX (c1);
INSERT IGNORE INTO c_unique(c1) SELECT c1 FROM table;
INSERT IGNORE INTO c_unique(c1) SELECT c2 FROM table;
INSERT IGNORE INTO c_unique(c1) SELECT c3 FROM table;

使用UNION将隐式地为您提供DISTINCT结果并执行带有排序的临时操作以完成此操作。通过使用INSERT IGNORE,您只需基于UNIQUE索引拒绝INSERT操作上的行,我认为这将更快。

注意:的 在字符串列上使用UNIQUE将适用于特定的字符长度。因此,您可能必须指定前缀长度。您可以在此处阅读有关此主题的更多信息:CREATE INDEX语法