2016-07-20 2 views
2

Таблица "Серверы":условия MySQL между двумя таблицами

+----+----------------+ 
| id | disabled_until | 
+----+----------------+ 
| 1 | 0    |  // disabled_until is an epoch timestamp 
| 2 | |  // (irrelevant) 
| 3 | 1468969442  | 
+----+----------------+ 

стол "server_disables":

+----+-----------+-------+----------------+ 
| id | server_id | tld | disabled_until | 
+----+-----------+-------+----------------+ 
| 1 | 1   | .com | 0    | 
| 2 | 1   | .org | 1468969900  | 
| 2 | 3   | .com | 1468969900  | 
+----+-----------+-------+----------------+ 


Я пытаюсь сделать запрос, который выбирает строки из серверов где:

  1. Имеются 0 строки в server_disables где server_disables.server_id = servers.id или
  2. Там в 1+ строк в server_disables где server_disables.server_id = servers.id и server_disables.disabled_until меньше определенного времени (скажем, х)

Я считаю, что я создал запрос, который может выполнить # 2, но не # 1. Я не знаю, где продолжить или как добавить случай, когда в server_disables имеется 0 соответствующих строк. Вы можете увидеть мою попытку в OR d.disabled_until IS NULL, но это не работает.

Запрос:

SELECT s.* FROM servers s 
INNER JOIN server_disables d ON (d.server_id = s.id AND d.tld = '.com') 
WHERE (s.disabled_until < 1468984373) 
AND (d.disabled_until < 1468984373 OR d.disabled_until IS NULL) 
ORDER BY RAND() LIMIT 5 

Мой вопрос заключается в том, чтобы сделать мой запрос также показывает строку из таблицы «серверов», где есть 0 строк слиты с INNER JOIN.

+1

Используйте 'ЛЕВЫЙ JOIN'. – Blank

ответ

3

Вы должны использовать LEFT JOIN, и, возможно, там дублируются строки, так что вам может понадобиться использовать DISTINCT, попробуйте следующее:

SELECT DISTINCT s.* FROM servers s 
LEFT JOIN server_disables d ON (d.server_id = s.id AND d.tld = '.com') 
WHERE (s.disabled_until < 1468984373) 
AND (d.disabled_until IS NULL OR d.disabled_until < 1468984373) 
ORDER BY RAND() LIMIT 5 
+0

Удивительный, спасибо! Я не знал о «LEFT JOIN». :) Это прекрасно работает. – Bailey

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