2015-12-23 2 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

Вы попробовали группу concate? – devpro

ответ

3

Вы можете UNPIVOT таблицы с помощью UNION ALL:

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 
Смежные вопросы