MySQL: как применить условие на 5 полях? - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть 5 соединенных таблиц следующим образом:

SELECT `t1`.`name` as 't1 name', 
`t2`.`name` as 't2 name',
`t3`.`name` as 't3 name',
`t4`.`name` as 't4 name',
`t5`.`name` as 't5 name'

FROM `myscheme`.`t1` 
JOIN `myscheme`.`t2`
ON `t1`.`code`= `t2`.`code`

JOIN `myscheme`.`t3`
ON `t2`.`code`= `t3`.`code`

JOIN `myscheme`.`t4`
ON `t3`.`code`= `t4`.`code`

JOIN `myscheme`.`t5`
ON `t4`.`code`= `t5`.`code`;

Я хочу добавить предложение WHERE, которое говорит следующее: Не все поля version в 5 таблицах (t1.version, * 1006)*, t3.version, t4.version и t5.version) начинаются с '55', но некоторые делают.Поле version имеет тип string.Другими словами, условие ищет несоответствие между таблицами в этой версии.Я не хочу запрашивать строки, когда все версии таблиц не начинаются с 55.Это соответствует.Я просто хочу запросить те строки, где есть те же таблицы версии 55, но не все из них.

РЕДАКТИРОВАТЬ:

Вот игрушечный пример.Я сожалею, что очень сложно опубликовать точные таблицы и данные из-за сложности.Этот образец передает значение и регистр:

t1:

------------------------
name    code    verison
------------------------
aa       11      55x
bb       22      33x
cc       99      55x

t2:

------------------------
name    code    verison
------------------------
dd       11      55x
ee       22      33x    
ff       99      55x

t3:

------------------------
name    code    verison
------------------------
gg       11      66x
hh       22      44x
ii       99      55x

t5:

------------------------
name    code    verison
------------------------
jj       11      66x
kk       22      88x
ll       99      55x

t5:

name    code    verison
mm       11     66x
nn       22     88x
oo       99     55x

В этих 5 таблицах есть две строки в каждой таблице, которые имеют одинаковые code среди 5 таблиц.Мне интересно найти строки, в которых одна или несколько таблиц имеют version, начинается с 55, , но не все таблицы .Которые в этом случае удовлетворяются строками с name: (aa, dd, gg, jj, mm) (которые имеют code 11).

Но остальные строки не должны выходить из запроса.Зачем?потому что либо ни один из их version не начинается с 55, (name: bb, ee, hh, kk, mm), либо потому, что все они имеют version запускис 55 (name: cc, ff, ii, ll, oo).

Другими словами, мне нужны строки с несовместимой версией по сравнению с версиями, начинающимися с 55 (т.е. не только неравные версии, но точно, некоторые начинаются с 55а некоторые нет)

Ответы [ 3 ]

0 голосов
/ 16 апреля 2019
where (t1.version like '55%' or -- at least one version starts with 55
      t2.version like '55%' or
      t3.version like '55%' or
      t4.version like '55%' or
      t5.version like '55%')
and not (t1.version like '55%' and -- all versions start with 55, so we negate with NOT
      t2.version like '55%' and
      t3.version like '55%' and
      t4.version like '55%' and
      t5.version like '55%')

Первое предложение означает, что по крайней мере одно из полей версии начинается с 55.

Второе предложение (с отрицанием NOT) будет истинным, только если все началось с 55.

0 голосов
/ 16 апреля 2019

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

WHERE
    CONCAT_WS(LEFT(t1.version, 2),
            LEFT(t2.version, 2),
            LEFT(t3.version, 2),
            LEFT(t4.version, 2),
            LEFT(t5.version, 2)) IN ('55' , '5555', '555555', '55555555');
0 голосов
/ 16 апреля 2019

Вы можете добавить:

where t1.version like '55%' or
      t2.version like '55%' or
      t3.version like '55%' or
      t4.version like '55%' or
      t5.version like '55%'

EDIT:

Для уточнения вы можете добавить:

where (t1.version like '55%' or
       t2.version like '55%' or
       t3.version like '55%' or
       t4.version like '55%' or
       t5.version like '55%' 
      ) and
      (least(t1.version, t2.version, t3.version, t4.version, t5.version) not like '55%' or
       greatest(t1.version, t2.version, t3.version, t4.version, t5.version) not like '55%'
      )
...