2016-07-20 19 views
2

Table "Server":MySQL Bedingungen zwischen zwei Tabellen

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

Table "server_disables":

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


ich eine Abfrage zu machen versuchen, die Zeilen aus Servern wählt wo:

  1. Es gibt 0 Zeilen in server_disables wo server_disables.server_id = servers.id oder
  2. Es gibt 1+ Reihen in server_disables wo server_disables.server_id = servers.id und die server_disables.disabled_until ist weniger als eine bestimmte Zeit (sagen wir, x)

Ich glaube, ich habe eine Abfrage erstellt, die # 2, aber nicht # 1 erreichen kann. Ich weiß nicht, wo ich weitermachen soll oder wie ich einen Fall hinzufügen kann, wenn es in server_disables 0 übereinstimmende Zeilen gibt. Sie können meinen Versuch in OR d.disabled_until IS NULL sehen, aber es funktioniert nicht.

Abfrage:

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 

Meine Frage ist, wie meine Frage machen zeigen auch Zeilen aus der „Server“ Tabelle, wo es 0 Zeilen aus den INNER JOIN verschmolzen.

+1

Verwenden 'LINKS JOIN'. – Blank

Antwort

3

Sie sollten LEFT JOIN verwenden, und vielleicht gibt es Zeilen dupliziert, so müssen Sie möglicherweise auch DISTINCT verwenden, versuchen Sie dies:

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

Super, danke! Ich wusste nicht über 'LEFT JOIN'. :) Es funktioniert perfekt. – Bailey