2016-09-29 3 views
0

In mySQL ist mein Tisch animals:Wie kann ich die Werte aus einer Tabelle markieren, die nicht in einer anderen Tabelle (mySQL) sind?

+-----------+--------+--------+ 
| animal_ID | name | animal | 
+-----------+--------+--------+ 
|   1 | alan | dog | 
|   2 | sam | frog | 
|   3 | marion | cat | 
|   4 | george | rabbit | 
|   5 | bob | bird | 
+-----------+--------+--------+ 

und das ist mein Tisch orders

+----------+-----------+ 
| date | animal_ID | 
+----------+-----------+ 
| 02.03.16 |   4 | 
| 12.04.16 |   3 | 
| 18.07.16 |   1 | 
+----------+-----------+ 

ich alle Tiere aufgelistet werden sollen, aber die Tiere markieren, die nicht in der Tabelle orders sind rot. Das ist mein erwartetes Ergebnis

<table > 
 
    <tr> 
 
    <td>alan</td> 
 
    </tr> 
 
    <tr> 
 
    <td style="color:red">sam</td> 
 
    </tr> 
 
    <tr> 
 
    <td>marion</td> 
 
    </tr> 
 
    <tr> 
 
    <td>george</td> 
 
    </tr> 
 
    <tr> 
 
    <td style="color:red">bob</td> 
 
    </tr> 
 
</table>

ich jetzt das Problem haben, dass ich weiß nicht, wie alle Tiere zur Liste aus dem Tiertisch, bekomme ich nur die Tiere in meiner Liste, die nicht in der Auftragstabelle:

$sql = 'SELECT * FROM animals a WHERE EXISTS (SELECT * FROM orders o WHERE o.animal_ID = a.animal_ID)'; 

Hier ist mein Ergebnis folgt aus:

<table > 
 
     <tr> 
 
     <td>alan</td> 
 
     </tr> 
 
     <tr> 
 
     <td>marion</td> 
 
     </tr> 
 
     <tr> 
 
     <td>george</td> 
 
     </tr> 
 
    </table>

+0

Einfach aus der Tabelle "Tiere" abfragen und ausdrucken und auch in der Tabelle 'order' nachschauen, ob es in der Tabelle ist oder Ihnen eine Ausgabe gibt, dann fügen Sie den roten Stil hinzu. –

+2

Mögliches Duplikat von [Wie überprüft man, ob jeder Primärschlüsselwert in einer anderen Tabelle als Fremdschlüssel referenziert wird] (http: // stackoverflow.com/questions/39761363/how-to-check-wenn-jeder-Primärschlüssel-Wert-ist-wird-als-fremd-Schlüssel-in-ein-referenziert) – e4c5

+0

@ AT-2016 Ja, die Namen der Tiere – Jarla

Antwort

1

Sie müssen dieses Skript mit zwei Abfrage machen.

1. Query for all the animals. 
2. Query with the animals ID in the orders. 

Die erste ist:

$sql = 'SELECT * FROM animals"; 

Schleife Dieses und lassen in der Tabelle order innerhalb des ersten schlaufen

$sql2 = "SELECT * FROM orders WHERE animal_ID = fetched_animal_ID"; 
if(mysqli_num_rows($sql2) > 0){ 
    // print the normalrows here 
}else{ 
    // print the red rows here 
} 

=========== ================================================= =

Sie können dies auch mit der LINKEN VERBINDUNG -

$sql = "SELECT *, o.animal_ID as o_animal FROM animals a LEFT JOIN orders o 
     ON a.animal_ID = o.animal_ID"; 

Online Example

Jetzt müssen Sie die o_animal überprüfen, ob es null oder leer ist dann verwenden, um die red Zeilen und sonst das normal.

Wenn Sie irgendeine Frage haben, bitte fragen Sie mich.

+0

Dieser ist gut, aber gegen jede Aufzeichnung wird es eine Datenbank-Anruf. –

+0

Ich denke auch über das LINKE VERBINDEN nach, aber ich dachte, dass das direkte Vorgehen vorzuziehen sein wird, und ich helfe ** Jarla ** einige Zeit, damit ich sie verstehen kann. –

+0

ja, das wird funktionieren, aber es ist besser, die Berechnung im Hinterkopf zu behalten. –

0

Einfache Negation?

$sql = 'SELECT * FROM animals a WHERE NOT EXISTS (SELECT * FROM orders o WHERE o.animal_ID = a.animal_ID)'; 

Oder vielleicht die Zählung mit einer Sub-Abfrage packen, markieren Sie die Nullen ...

$sql = 'SELECT a.*, 
     (SELECT COUNT(*) FROM orders WHERE animal_ID = a.animal_ID) 
     FROM animals a'; 
+0

Aber das OP braucht alle Tiere .. –

+0

War am arbeiten, während Sie kommentiert ... –

1

Sie können eine andere Methode ohne Join-Abfrage versuchen.

Verwandte Themen