MySQL FIND_IN_SET无效

时间:2015-07-31 07:24:23

标签: 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

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

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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

谢谢。