2013-05-20 2 views
0

У меня есть этот запрос. Мне нужно выбрать строки, если логотип пуст ИЛИ кнопка пуста ИЛИ vanitylogo пуст. Кажется, это работает, но, печатая несколько строк для той же самой середины. Как это исправить?mysql query повторяет результаты

SELECT fmm.mid, 
     fmm.name , 
     fmn.mnname, 
     fmm.button, 
     fmm.logo, 
     fmm.vanitylogo 
FROM X fmm , 
    Y fmn 
WHERE fmm.`button` = '' 
    OR fmm.`button` = 'NULL' 
    OR fmm.`button` = 'None' 
    OR fmm.`logo` = '' 
    OR fmm.`logo` = 'NULL' 
    OR fmm.`logo` = 'None' 
    OR fmm.`vanitylogo` = '' 
    OR fmm.`vanitylogo` = 'NULL' 
    OR fmm.`vanitylogo` IS NULL 
    AND fmm.mid=fmn.nid 
    AND fmm.status='active' 
    AND fmm.xyz_status='active' 
+1

На боковой ноте я предлагаю вам ознакомиться с этой страницей http://flylib.com/books/en/2.823.1.194/1/ Code Complete 2, «примеры психологических расстояний между именами переменных» –

ответ

3

У вас есть две основные проблемы, связанные с запросом:

  1. Вы не правильно в квадратные скобки ваши OR условия
  2. Вы не условия соединения между таблицами, что приводит к «перекрестное соединение»

Попробуйте это:

SELECT fmm.mid, 
     fmm.name , 
     fmn.mnname, 
     fmm.button, 
     fmm.logo, 
     fmm.vanitylogo 
FROM X fmm 
JOIN Y fmn ON fmn.some_column = X.some_column -- FIX THIS 
WHERE (fmm.`button` in ('', 'NULL', 'None') 
    OR fmm.`logo` IN ('', 'NULL', 'None') 
    OR fmm.`vanitylogo` IN ('', 'NULL') 
    OR fmm.`vanitylogo` IS NULL) 
    AND fmm.mid=fmn.nid 
    AND fmm.status='active' 
    AND fmm.xyz_status='active' 

Вы должны заполнить в «FIX THIS»: строка с соответствующими именами столбцов

Что касается ОШ, я в комплекте некоторые вверх в IN() состоянии, а в квадратные скобки до много.

+0

, но это выбор результатов, в которых vanitylogo имеет значение NULL и не выбирает другие строки, в которых другие столбцы имеют значение NULL. –

+0

. Я имею в виду логотип и кнопку –

0

Выбираете таблицу «Y fmn». Для каждой строки в Y результаты будут повторяться. Вам нужен способ агрегирования результатов, возможно, с группой.

SELECT fmm.mid, 
     fmm.name , 
     fmn.mnname, 
     fmm.button, 
     fmm.logo, 
     fmm.vanitylogo 
FROM X fmm , 
    Y fmn 
WHERE fmm.`button` = '' 
    OR fmm.`button` = 'NULL' 
    OR fmm.`button` = 'None' 
    OR fmm.`logo` = '' 
    OR fmm.`logo` = 'NULL' 
    OR fmm.`logo` = 'None' 
    OR fmm.`vanitylogo` = '' 
    OR fmm.`vanitylogo` = 'NULL' 
    OR fmm.`vanitylogo` IS NULL 
    AND fmm.mid=fmn.nid 
    AND fmm.status='active' 
    AND fmm.xyz_status='active' 
group by fmm.mid, 
     fmm.name , 
     fmn.mnname, 
     fmm.button, 
     fmm.logo, 
     fmm.vanitylogo 
Смежные вопросы