MySQL FIND_IN_SET не работает

у меня есть эти таблицы

Ирасай стол

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

Таблица апмокедзимай:

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


person Rytis    schedule 31.07.2015    source источник
comment
В таблицах нет столбца tipas. Это должно быть t2.id?   -  person Barmar    schedule 31.07.2015


Ответы (2)


Вам нужно сгруппировать условия в предложении 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

ДЕМО

Без круглых скобок 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)
person Barmar    schedule 31.07.2015

Я изменил ваш 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

Спасибо.

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