2015-12-23 167 views
1

比方说,我有这样的MySQL的 - 选择所有列都是唯一的所有记录

id col1 col2 col3 col4 col5 col6 
1 1  2  3  4  5  6 
2 2  1  4  3  6  5 
3 1  1  2  3  4  5 

我希望选择,每一个领域都有不同的值的行的表。该放出来会是

id col1 col2 col3 col4 col5 col6 
1 1  2  3  4  5  6 
2 2  1  4  3  6  5 

我知道你可以做到这一点

SELECT * FROM table 
WHERE col1 <> col2 AND col2 <> col3... 

但会与这么多列永远走。是否有确定所有列是否唯一的特定功能?

+0

' FIELD()'将限制比较的数量到列数 –

+0

它可能有助于了解数据集是什么?例如,如果这是实际的数据集,你可以检查'SUM(cols)!= 15' ....另外,这可以在'INSERT'上避免吗? –

+0

你试过组合吗? – devpro

回答

3

可以使用UNION ALL UNPIVOT你的表:

SELECT id 
FROM (
    SELECT id, col1 AS col 
    FROM mytable 

    UNION ALL 

    SELECT id, col2 
    FROM mytable 

    UNION ALL 

    SELECT id, col3 
    FROM mytable 

    UNION ALL 

    SELECT id, col4 
    FROM mytable 

    UNION ALL 

    SELECT id, col5 
    FROM mytable 

    UNION ALL 

    SELECT id, col6 
    FROM mytable) AS t 
GROUP BY id 
HAVING COUNT(DISTINCT col) = 6 

如果你想选择的所有列,那么你做这样的事情:

SELECT * 
FROM mytable 
WHERE id IN (.... above query here ...) 

不幸的是,MySQL没有一个UNPIVOT运营商,这将使该上面的查询较少详细。

1

尝试此我希望这将帮助你

select 
(SELECT group_concat(DISTINCT col1) FROM table) as col1, 
(SELECT group_concat(DISTINCT col2) FROM table) as col2, 
(SELECT group_concat(DISTINCT col3) FROM table) as col3, 
(SELECT group_concat(DISTINCT col4) FROM table) as col4 
2

一点比你的解决方案更简洁,虽然它并不完美比例如果列数过大:

SELECT 
    * -- In actual live code you would of course never use '*' 
FROM 
    MyTable 
WHERE 
    col1 NOT IN (col2, col3, col4, col5, col6) AND 
    col2 NOT IN (col3, col4, col5, col6) AND 
    col3 NOT IN (col4, col5, col6) AND 
    col4 NOT IN (col5, col6) AND 
    col5 NOT IN (col6) -- Done as an IN just to be consistent