web-dev-qa-db-fra.com

SQL LEFT-JOIN sur 2 champs pour MySQL

J'ai une vue A et une vue B.

Dans A j'ai beaucoup d'informations sur certains systèmes, comme IP et port que je veux tout conserver. Dans B j'ai juste une information que je veux ajouter à A.

Les champs correspondants entre les deux vues sont IP et Port. Je dois donc faire correspondre les hôtes qui ont la même IP et le même port dans les deux vues.

Exemples:

Vue A:

IP | OS     | Hostname | Port | Protocol
1  | Win    | hostONE  | 80   | tcp 
1  | Win    | hostONE  | 443  | tcp 
1  | Win    | hostONE  | 8080 | tcp 
2  | Linux  | hostTWO  | 21   | tcp
2  | Linux  | hostTWO  | 80   | tcp
3  | Linux  | hostTR   | 22   | tcp

Vue B:

IP | Port | State
1  | 443  | Open
2  | 80   | Closed

SORTIE

IP | OS     | Hostname | Port | Protocol | State
1  | Win    | hostONE  | 80   | tcp      |
1  | Win    | hostONE  | 443  | tcp      | Open
1  | Win    | hostONE  | 8080 | tcp      |
2  | Linux  | hostTWO  | 21   | tcp      | Closed
2  | Linux  | hostTWO  | 80   | tcp      |
3  | Linux  | hostTR   | 22   | tcp      |

Remarque: il est possible que certains hôtes de la vue A n'aient aucun élément lié à l'IP/port dans la vue B.

Il est également possible que certains hôtes de la vue A aient une correspondance dans la vue B.

J'ai pensé que je devrais utiliser LEFT JOIN pour avoir toutes les entrées de la vue A et la bonne entrée associée de la vue B, mais cela n'a pas fonctionné. Je ne suis pas en mesure d'ajuster la requête avec la bonne clause WHERE et la solution JOIN.

Une idée?

21
Possa
select a.ip, a.os, a.hostname, a.port, a.protocol,
       b.state
from a
left join b on a.ip = b.ip 
           and a.port = b.port
53
juergen d

Essayons de cette façon:

select 
    a.ip, 
    a.os, 
    a.hostname, 
    a.port, 
    a.protocol, 
    b.state
from a
left join b 
    on a.ip = b.ip 
        and a.port = b.port /*if you has to filter by columns from right table , then add this condition in ON clause*/
where a.somecolumn = somevalue /*if you have to filter by some column from left table, then add it to where condition*/

Ainsi, dans la clause where, vous pouvez filtrer le jeu de résultats par colonne de la table de droite uniquement de cette façon:

...
where b.somecolumn <> (=) null
5
veljasije