2013-11-26 47 views
0

我在WordPress插件中发现了这个代码,但我无法理解它是什么意思或如何读取它。在MySQL中嵌套IF的评估

有人可以帮助我了解这个代码:?

IF(agr_sam_ads.ad_users = 0, TRUE, IF(agr_sam_ads.ad_users_reg = 1, IF(agr_sam_ads.x_ad_users = 1, NOT FIND_IN_SET("admin", agr_sam_ads.x_view_users), TRUE .... 

我还没有粘贴整个查询,因为它很大。在我感兴趣得到帮助的是,看起来像查询的一部分:

IF(expression, value, IF(expression, IF(expression, SQL Logical Query, value ... 

我还没有看到这样的语法,我不知道哪里来搜索。在MySQL文档中,IF语句的语法如下:http://dev.mysql.com/doc/refman/5.0/en/if.html,它看起来不像我上面粘贴的那个。

只为用户感兴趣的完整的代码,该代码是在这里:

SELECT 
agr_sam_places.id, 
agr_sam_places.name, 
agr_sam_places.description, 
agr_sam_places.code_before, 
agr_sam_places.code_after, 
agr_sam_places.place_size, 
agr_sam_places.place_custom_width, 
agr_sam_places.place_custom_height, 
agr_sam_places.patch_img, 
agr_sam_places.patch_link, 
agr_sam_places.patch_code, 
agr_sam_places.patch_adserver, 
agr_sam_places.patch_dfp, 
agr_sam_places.patch_source, 
agr_sam_places.trash, 
(
    SELECT 
     COUNT(*) 
    FROM 
     agr_sam_ads 
    WHERE 
     agr_sam_ads.pid = agr_sam_places.id 
    AND 
     agr_sam_ads.trash IS FALSE 
) AS ad_count, 
(
    SELECT 
     COUNT(*) 
    FROM 
     agr_sam_ads 
    WHERE 
     agr_sam_ads.pid = agr_sam_places.id 
    AND 
     agr_sam_ads.trash IS FALSE 
    AND 
     (
      IF(agr_sam_ads.ad_users = 0, TRUE, IF(agr_sam_ads.ad_users_reg = 1, IF(agr_sam_ads.x_ad_users = 1, NOT FIND_IN_SET("admin", agr_sam_ads.x_view_users), TRUE 
     ) 
    AND 
     IF(agr_sam_ads.ad_users_adv = 1, (agr_sam_ads.adv_nick <> "admin"), TRUE), FALSE))) 
    AND 
     (
      (
       agr_sam_ads.view_type = 1 
      ) 
     OR 
      (
       agr_sam_ads.view_type = 0 
      AND 
       (
        agr_sam_ads.view_pages+0 & 256 
       ) 
      ) 
     ) 
    AND 
     (
      agr_sam_ads.ad_cats = 0 
     ) 
    AND 
     (
      agr_sam_ads.ad_authors = 0 
     ) 
    AND 
     IF(agr_sam_ads.ad_schedule, CURDATE() BETWEEN agr_sam_ads.ad_start_date AND agr_sam_ads.ad_end_date, TRUE) 
    AND 
     IF(agr_sam_ads.limit_hits, agr_sam_ads.hits_limit > agr_sam_ads.ad_hits, TRUE) 
    AND 
     IF(agr_sam_ads.limit_clicks, agr_sam_ads.clicks_limit > agr_sam_ads.ad_clicks, TRUE) 
    AND 
     (
      agr_sam_ads.ad_weight > 0 
     ) 
) AS ad_logic_count, 
(
    SELECT 
     COUNT(*) 
    FROM 
     agr_sam_ads 
    WHERE 
     agr_sam_ads.pid = agr_sam_places.id 
    AND 
     agr_sam_ads.trash IS FALSE 
    AND 
     (
      IF(agr_sam_ads.ad_users = 0, TRUE, IF(agr_sam_ads.ad_users_reg = 1, IF(agr_sam_ads.x_ad_users = 1, NOT FIND_IN_SET("admin", agr_sam_ads.x_view_users), TRUE) 
     AND 
      IF(agr_sam_ads.ad_users_adv = 1, (agr_sam_ads.adv_nick <> "admin"), TRUE), FALSE))) 
     AND 
      (
       (
        agr_sam_ads.view_type = 1 
       ) 
      OR 
       (
        agr_sam_ads.view_type = 0 
       AND 
        (
         agr_sam_ads.view_pages+0 & 256 
        ) 
       ) 
      ) 
     AND 
      (
       agr_sam_ads.ad_cats = 0 
      ) 
     AND 
      (
       agr_sam_ads.ad_authors = 0 
      ) 
     AND 
      IF(agr_sam_ads.ad_schedule, CURDATE() BETWEEN agr_sam_ads.ad_start_date AND agr_sam_ads.ad_end_date, TRUE) 
     AND 
      IF(agr_sam_ads.limit_hits, agr_sam_ads.hits_limit > agr_sam_ads.ad_hits, TRUE) 
     AND 
      IF(agr_sam_ads.limit_clicks, agr_sam_ads.clicks_limit > agr_sam_ads.ad_clicks, TRUE) 
     AND 
      IF(agr_sam_ads.ad_weight > 0, (agr_sam_ads.ad_weight_hits*10/(agr_sam_ads.ad_weight*1000)) < 1, FALSE) 
    ) AS ad_full_count 
FROM 
    agr_sam_places 
WHERE 
    agr_sam_places.id = 10 
AND 
    agr_sam_places.trash IS FALSE; 
+0

如何新用户是否拥有2915的代表? – Kermit

+0

MySQL中的新功能,不在StackOverflow中;),我只是修复了标题以帮助您:) –

+0

*“仅供**傻瓜**代码感兴趣的用户...”*明智地声明。 –

回答

1

应读作:

IF (
    expression, 
    valueIfExpressionIsTrue, 
    valueIfExpressionIsValue 
) 

所以把你的代码的一部分:

IF(
    agr_sam_ads.ad_users = 0, 
    TRUE, 
    IF(
     agr_sam_ads.ad_users_reg = 1, 
     2, 
     3 
    ) 
) 

我看到你熟悉PHP,所以本质上如果这是PHP,代码将是

if ($arg_sam_ads_ad_users == 0) { 
    return true; 
} else { 
    if ($arg_sam_ads_ad_users_reg == 1) { 
     return 2; 
    } else { 
     return 3; 
    } 
} 
1

这基本上是在不使用IF _ THEN _ ELSE _ ENDIF语法的情况下创建IF-ELSE树。

看看下面的例子:

IF(1=0, 1, IF(1=1, 1, 0)) 

这是一个用C语法如下等效:

IF (1=0) { 
    1 
} 
ELSE IF (1=1) { 
    1 
} 
ELSE { 
    0 
} 

比较常见的SQL语法如下:

IF 1=0 THEN 
    1; 
ELSEIF 1=1 THEN 
    1; 
ELSE 
    0; 
ENDIF; 
+0

不完全正确。它不是'} ELSE IF(){' - 这是'} ELSE {IF(){'。 – h2ooooooo

+0

我的答案中有一个语法错误。虽然你说的是正确的,但有一个ELSEIF关键字(不是ELSE,就像我最初发布的那样)。 –