MySQL FIND_IN_SET 不工作

MySQL FIND_IN_SET not working

我有这些 tables

Irasai table

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 table:

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

我需要得到这个,因为它属于 id 为 1 的用户

我修改了你的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

谢谢。

您需要将 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)