2011-03-13 97 views
2

我有兩個表加入user_id。在下面的查詢中,我正在比較table_two中的act_val,以確保它位於或等於來自table_one的min_valmax_val之間。但是有時table_one中的user_id在table_two中找不到。在這些情況下,我希望act_val被視爲0,並限定table_one的min_val較低。那可能嗎?怎麼會這樣?如何將NULL值視爲0從MySQL

SELECT tb1.id FROM table_one tb1 
INNER JOIN table_two tb2 WHERE 
    tb1.min_val <= tb2.act_val AND tb1.min_val >= tb2.act_val 
    AND tb2.user_id = tb1.user_id 
GROUP BY ad.id; 

回答

5

您需要在左邊的USER_ID鏈接JOIN條件(ON子句),並在WHERE子句(過濾器)休息。 tb2.act_val在缺失時被視爲0,使用IFNULL。我也修正了你的第二個條件,它應該是    tb1。 max _val> =     not     tb1。 分鐘 _val> =

 SELECT tb1.id 
     FROM table_one tb1 
    LEFT JOIN table_two tb2 ON tb2.user_id = tb1.user_id 
     WHERE tb1.min_val <= IFNULL(tb2.act_val,0) 
     AND tb1.max_val >= IFNULL(tb2.act_val,0) 
    GROUP BY tb1.id; 

LEFT JOIN

如果沒有用於在ON右表中沒有匹配的行或USING部分在左連接,設置爲NULL所有列的行用於右表。你可以利用這一點來在表中查找有沒有對應的另一個錶行:

+0

我實現這一點,但左加入了我的查詢需要幾分鐘來計算(100X慢)。我還有其他的內部聯接和條件。這是正常的嗎?我可以混合LEFT JOIN和INNER JOIN嗎? – Kyle 2011-03-13 21:05:17

+0

你可以混合內部/左邊的連接,但你必須確保它按正確的順序完成。不僅如此,LEFT JOINs意味着即使沒有要在右側匹配的記錄,也要從左側開始記錄所有記錄 - 根據定義,這會增加處理其餘查詢記錄的次數 – RichardTheKiwi 2011-03-13 21:20:37

0

您可以使用IFNULL(tbl2.act_val, 0)

0
  1. 更換inner joinleft join
  2. 使用coalesce(tb2.act_val, 0),而不是tb2.act_val

PS同樣 - 您的查詢看起來不正確,因爲你指的是未定義的表廣告。

0

可以使用COALESCE功能:

WHERE COALESCE(tb1.min_val, 0) <= tb2.act_val COALESCE(tb1.min_val, 0) >= tb2.act_val 
1

使用外連接(LEFT在下面的例子)來獲取所有的TABLE1記錄可能會或可能不會有匹配TABLE2中的user_id值。然後構建WHERE子句來篩選下來設置爲你想要的記錄:

SELECT tb1.id 
    FROM table_one tb1 
LEFT JOIN table_two tb2 ON tb2.user_id = tb1.user_id 
    WHERE tb2.act_val BETWEEN tb1.min_val AND tb1.max_val 
     OR tb1.min_val < 0 
GROUP BY tb1.id 
+0

幾乎與我的記錄相同即將發佈,只有在我的情況下,它會像'... ON tb2.user_id = tb1.user_id AND tb2.act_val BETWEEN tb1.min_val AND tb1.max_val WHERE tb2.user_id IS NULL OR tb1.min_val <0 '。你的一個很好的小竅門是使它更簡潔。 – 2011-03-13 21:46:10

相關問題