2015-12-16 3 views
1

я есть этот SQL запрос на выборкуMysql и если/другое заявление в ИНЕКЕ

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

и мне нужно сделать что-то вроде этого:

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', с тщательной логикой'() 'и' AND/OR'. –

+0

вы хотите, чтобы все боты (список A), а если нет в списке A, убедитесь, что они не в списке (список B)? – xQbert

+0

@xQbert Я хочу получить все боты, которые ничего не отправили этому получателю, если наш отправитель! = Отправитель, для этого у меня есть таблицы ботов и сообщений. –

ответ

1

Использование внешнего соединения это будет

  • Верни все боты из таблицы бот
  • и данных из сообщения talbe, что соответствует
  • но мы исключаем данные сопоставления возвращения только ботам , где сообщение, имеющее получатель и отправитель при условии не существует для этого конкретного бота

возвращение всех бот

Select * from bots B 
LEFT JOIN messages M 
    on M.BotID = B.ID 
and M.Sender = $sender 
and M.Recipient = $Recipient 
Where M.BotID is null 
+0

Это работает, но не правильно, если isset (sender = отправитель и получатель = получатель) мы выбираем botid из этой строки, только если not isset мы выбираем, где id не в (recipient = recipient) –

+0

Хорошо, поэтому, на простом английском языке .. .: если получатель (r) и отправитель (ы) предоставлены запросу, возвращают всех ботов, которые получили сообщение. если r и s не установлены, при условии, что все боты, которые не получили сообщение ... правильно? – xQbert

Смежные вопросы