MYSQL-запрос, возвращающий больше значений

Проблема в том, что у меня есть таблицы DATA и SAT, которые имеют 3 поля, каждое из этих полей может содержать значение 991. Ниже приведено неправильное количество столбцов, дающих больше данных. Как получить правильное значение. Пожалуйста посоветуй

DATA

id
insurance1
insurance2
insurance3

SAT
id
insurance1
insurance2
insurance3

SELECT * FROM DATA v, SAT s where v.PRIMARY_INSURANCE_ID = '991' 
or v.INSURANCE_ID  = '991' 
or v.INSURANCE_ID = '991' 
and s.INSURANCE_ID = '991' 
or s.INSURANCE_ID = '991' 
or s.INSURANCE_ID = '991';

Позвольте мне привести пример Пример 1

DATA    
    id
    insurance1 =991
    insurance2 =56
    insurance3 =22

    SAT
    id
    insurance1=56
    insurance2=23
    insurance3=96

When query is executed. The count should be 1

Пример 2

DATA    
    id
    insurance1 =991
    insurance2 =56
    insurance3 =22

    SAT
    id
    insurance1=991
    insurance2=23
    insurance3=96

When query is executed. The count should be 2

Пример 3

DATA    
    id
    insurance1 =991
    insurance2 =56
    insurance3 =991

    SAT
    id
    insurance1=991
    insurance2=23
    insurance3=96

When query is executed. The count should be 3 or 2

2 ответа

Решение

У вас есть две таблицы, и вы хотите сосчитать в них 991. Таким образом, таблицы не обязательно связаны, и объединение не имеет смысла. Просто добавьте две цифры:

select
  (select count(*) from data where 991 in (insurance1, insurance2, insurance3))
  +
  (select count(*) from sat where 991 in (insurance1, insurance2, insurance3));

Кстати: будьте осторожны при смешивании AND и OR:-)

Я бы предложил перефразировать это как join:

SELECT *
FROM DATA v JOIN
     SAT
     ON '991' in (v.PRIMARY_INSURANCE_ID, v.INSURANCE_ID) AND 
        '991' in (s.INSURANCE_ID)

Ваш запрос содержит только три поля. Вы можете продлить in список, чтобы иметь все столбцы, которые вы хотите. Основываясь на вашей структуре таблицы:

SELECT *
FROM DATA v JOIN
     SAT
     ON '991' in (v.INSURANCE1, v.INSURANCE2, v.INSURANCE3) AND 
        '991' in (s.INSURANCE1, s.INSURANCE2, s.INSURANCE3);

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

Я не думаю, что вы хотите join совсем:

select count(*), count(distinct id)
from (select id, insurance1 as insurance from data union all
      select id, insurance2 from data union all
      select id, insurance3 from data union all
      select id, insurance1 from sat union all
      select id, insurance2 from sat union all
      select id, insurance3 from sat
     ) i
where insurance = '991';

использование count(*) чтобы получить 3 и count(distinct id) чтобы получить 2. Примечание: последний предполагает, что idсоответствие между таблицами.

Другие вопросы по тегам