2015-12-16 26 views
1

我有這樣的SQL SELECT查詢mysql的,如果在WHERE子句

SELECT * 
FROM bots 
WHERE id NOT IN (select botid 
       from messages 
       where messages.recipient = :recipient) 
limit 1 

/else語句,我需要做這樣的事情:

SELECT * 
FROM bots 
[if isset(recipient = $recipient AND sender = $sender)] 
    WHERE id IN (select botid 
       from messages 
       where messages.recipient = :recipient and sender = :sender) 
else 
    WHERE id NOT IN (select botid 
        from messages 
        where messages.recipient = :recipient) 
limit 1 

[] - 僞代碼

如何使這個查詢?

機器人表:

------------------------------------------------------- 
| id  | auth_token | messages_today | vkid | 
------------------------------------------------------- 
| 1  | token |     0 | 2323 | 
------------------------------------------------------- 
| 2  | token |      0 | 2343 | 
------------------------------------------------------- 

信息表:

----------------------------------------------------------- 
| id  | recipient | sender | botid | messageid | 
----------------------------------------------------------- 
| 1  | 12   |  1 |  1 |  3322 | 
----------------------------------------------------------- 
| 2  | 12   |  2 |  2 | 332123 | 
----------------------------------------------------------- 
| 3  | 13   |  1 |  1 | 332123 | 
----------------------------------------------------------- 
+0

從你的僞收件人和發件人的郵件,它是不清楚你想如何應用該條件。通過仔細的()分組和邏輯與/或邏輯,通常可以將這樣的條件(基於存在/不存在輸入值)直接處理到WHERE子句中。 –

+0

你想要所有的機器人(列表A),如果他們不在列表A中,那麼確保它們不在列表B中? – xQbert

+0

@xQbert我想得到所有沒有發送任何東西給這個收件人的機器人,如果我們的發件人!=發件人,爲此我有機器人和郵件表 –

回答

1

使用外連接,這將

  • 返回從機器人表
  • 從消息中的所有機器人和數據talbe匹配
  • 但隨後我們消除了匹配的數據僅返回機器人 在具有提供不存在針對特定機器人

回報所有漫遊

​​
+0

這個工作,但不正確,如果isset(發件人=發件人和收件人=收件人),我們從這一行選擇botid,只是如果不是isset我們選擇在哪裏id不在(收件人=收件人) –

+0

好吧,用純​​英文.. 。:如果收件人(r)和發件人(s)提供給查詢返回所有收到該郵件的機器人。如果r和s沒有設置,提供所有沒有收到消息的機器人......對不對? – xQbert