2013-03-18 2 views
0

я не знаю, если это возможно, но я пытаюсь SELECT не совпадающих столбцов, скажем, у меня есть таблица со столбцами:MySQL запросов выбрать только не совпадающие пары

id, user_name, color1, color2, fruit1, fruit2

Я хотел бы, чтобы выбрать строку по идентификатору только если color1 и color2 ИЛИ! fruit1, fruit2 теперь равны друг другу. Если color1 == color2 ИЛИ fruit1 == fruit2 запрос должен возвращать 0 строк. Если color1 <>color2 и fruit1 == fruit2 строка должна возвращать только id, user_name, color1, color2

благодаря

ответ

0

Я думаю, что это должно быть довольно просто.

SELECT id, user_name, color1, color2 
FROM tableName 
WHERE (color1 <> color2) AND (fruit1 = fruit2) 
0

Самый простой способ, это просто расширить логики и включают в себя оба случая:

SELECT id, user_name, color1, color2, fruit1, fruit2 
FROM myTable 
WHERE (color1 <> color2 AND fruit1 = fruit2) 
OR (color1 = color2 AND fruit1 <> fruit2) 

От ваш комментарий, вы должны попробовать что-то немного более сложное:

SELECT nonmatching.id, user_name, prop_name, value1, value2 
FROM 
(
    SELECT id, user_name, prop_name, value1, value2 
    FROM 
    (
     SELECT id, user_name, 'color' AS prop_name, 
      color1 AS value1, color2 AS value2 
     FROM myTable 
     UNION ALL 
     SELECT id, user_name, 'fruit' AS prop_name, 
      fruit1 AS value1, fruit2 AS value2 
     FROM myTable 
    ) propertyExpanded 
    WHERE value1 <> value2 
) nonmatching 

Если вы хотите только вернуть строки с одним несоответствием, например, вы можете добавить следующее:

INNER JOIN 
(
    SELECT id, COUNT(1) AS mismatchCount = 1 
    FROM 
    (
     SELECT id, user_name, 'color' AS prop_name, 
      color1 AS value1, color2 AS value2 
     FROM myTable 
     UNION ALL 
     SELECT id, user_name, 'fruit' AS prop_name, 
      fruit1 AS value1, fruit2 AS value2 
     FROM myTable 
    ) propertyExpanded 
    WHERE value1 <> value2 
    GROUP BY id 
) nonmatchingCount ON nonmatching.id = nonmatchingCount.id 
WHERE nonmatchingCount.mismatchCount = 1 
+0

У меня есть много столбцов для сравнения, я не могу включить все случаи. BTW этот метод также возвращает соответствующие таблицы. Я хочу только вернуть набор данных с 'id' и не сопоставлять таблицы. – kajab

+0

@kajab Посмотрите мое редактирование и посмотрите, насколько оно ближе к тому, что вы пытаетесь получить –

0

Это должно работать:

SELECT id, 
     user_name, 
     color1, 
     color2 
FROM mytable 
WHERE (color1 = color2) != (fruit1 = fruit2) 

Трюк в том, что я сравниваю результаты сравнения как булевы значения.

Этот подход может быть обобщен для поддержки более двух видов точных совпадений данных. А именно, вы можете использовать подобный трюк путем подсчета спички так:

SELECT * FROM mytable 
WHERE (color1 = color2) 
    + (fruit1 = fruit2) 
    + ... 
    + (kind1 = kind2) 
    = 1 

В этом запросе, логическое FALSE или TRUE неявно приводится к 0 или 1.

Таким образом, этот запрос будет давать строки только тогда, когда точно соответствует одному из.

Смежные вопросы