2015-07-31 5 views
0

У меня есть эти таблицыMySQL FIND_IN_SET не работает

Irasai стол

invoice_nr | pard_suma | pard_vad | pirk_vad 
1122   200   2,4,6  2,1,3 
1111   502,22  3   4 
1112   5545  3   4,1 
54151  1000  2   1 
74411  1345,78  6   18 

Apmokejimai таблице:

id | invoice_nr | suma | tipas 
1 1122   100 2 
2 1112   5545 1 
3 1122   100 2 
4 1111   310 2 
5 54151  200 2 

Этот запрос:

select t1.invoice_nr, max(t1.pard_suma) as pardtotal, sum(t2.suma) as sumatotal 
from irasai t1 
left join apmokejimai t2 on t1.invoice_nr = t2.invoice_nr 
WHERE t2.tipas != '1' 
    OR t2.tipas IS NULL 
    AND FIND_IN_SET(1, t1.pirk_vad) 
    OR FIND_IN_SET(1, t1.pard_vad) 
group by invoice_nr 
having pardtotal <> sumatotal or sumatotal is null 

Результат таков:

invoice_nr | pard_total | sumtotal 
1111   502.22  310 
54151  1000   200 

Должно быть, как это

invoice_nr | pard_total | sumtotal 
54151  1000   200 

мне нужно, чтобы получить это, потому что он принадлежит пользователю, который идентификатор 1

+0

Там нет 'tipas' столбцов в таблицах. Должно ли это быть 't2.id'? – Barmar

+0

Отредактированное сообщение .... – Rytis

ответ

1

Вам необходимо сгруппировать условия в вашем предложении WHERE с круглыми скобками.

select t1.invoice_nr, max(t1.pard_suma) as pardtotal, sum(t2.suma) as sumatotal 
from irasai t1 
left join apmokejimai t2 on t1.invoice_nr = t2.invoice_nr 
WHERE (t2.tipas != '1' 
     OR t2.tipas IS NULL) 
    AND (FIND_IN_SET(1, t1.pirk_vad) 
     OR FIND_IN_SET(1, t1.pard_vad)) 
group by invoice_nr 
having pardtotal <> sumatotal or sumatotal is null 

DEMO

Без скобок AND имеет более высокий приоритет, чем OR, поэтому он интерпретируется как

WHERE t2.tipas != 1 
    OR (t2.tipas IS NULL 
     AND 
     FIND_IN_SET(1, t1.pirk_vad)) 
    OR FIND_IN_SET(1, t1.pard_vad) 
0

Я изменил свой SQL. Они будут работать.

select invoice_nr, max(pardtotal), sumatotal from (
    select t1.invoice_nr, max(t1.pard_suma) as pardtotal, sum(t2.suma) as sumatotal 
    from irasai t1 
    left join apmokejimai t2 on t1.invoice_nr = t2.invoice_nr 
    WHERE t2.tipas != '1' 
     OR t2.tipas IS NULL 
     AND FIND_IN_SET(1, t1.pirk_vad) 
     OR FIND_IN_SET(1, t1.pard_vad) 
    group by invoice_nr having pardtotal <> sumatotal or sumatotal is null 
) a 

спасибо.

+0

Не работает, теперь я получаю одну строку, счет-фактуру которой 1111, мне нужно получить 54151, потому что она не соответствует 1 (id) pirk_vad или pard_vad, счет 1111 не зависел от этого пользователя. – Rytis