2013-11-26 49 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,就像我最初發布的那樣)。 –