title: SQL query join issue in Java program
body: <p>I have a class that contains methods that connect to a database, run a query, and assigns data from the database into variables. </p>
  
  <p>The purpose of this Java program is to scan a database that houses information on security threats for client's servers. When the query is run it should return selected data fields from 2 tables (target_stats and attack_stats) upon reading that the number of attacks (target_stats.num_attacks) is above 0.</p>
  
  <p>I can successfully retrieve data from the target table but I get null values from the attacker table and I know that the field is not null in the database.</p>
  
  <p>My question: can anyone detect an error, most likely a logical one, in my query that is causing the unfavorable results? I am a beginner programmer and fairly new to SQL. </p>
  
  <p><em>Also, I am in the process of learning setters and getters in this program, all of the retrieved data is to be used in another class but I am testing and learning with just the target field for now. Perhaps that is causing an issue?</em></p>
  
  <p><strong>UPDATE</strong> I rant he query in MySQL query browser and get the same unfavorable result, so the problem is just in my query logic. I have done some research in queries and joins but must still be lacking suitable knowledge.</p>
  
  <p>My code (hopefully I post it correctly in format):</p>
  
  <pre><code>public class Database {
  
  String details = null;
  int threat_level = 0;
  ResultSet rslt = null;
  
  private String target2;
  
  Connection con;
  public void createConnection() {
  
      //Establish a connection
      try {
          con = DriverManager.getConnection("sensitiveInformation");
      } catch (SQLException e) {
  
          e.printStackTrace();
      }
      System.out.println("Database connected");
  }
  
  public ResultSet getData() {
  
      String query =  "SELECT target_stats.server_id, target_stats.target, target_stats.threat_level, target_stats.client_id, attack_stats.attacker, attack_stats.num_this_attack " +
              "       FROM target_stats " +
              "       LEFT OUTER JOIN attack_stats " +
              "       ON target_stats.target = attack_stats.target " +
              "       WHERE target_stats.num_attacks &gt; '0' " +
              "       AND target_stats.interval_id&gt;'2'";
      Statement stmt = null;
      try {
          stmt = con.createStatement();
      } catch (SQLException e) {
  
          e.printStackTrace();
      }
  
      try {
          rslt = stmt.executeQuery(query);
      } catch (SQLException e) {
  
          e.printStackTrace();
      }
  
      return rslt;    
  
  }
  
  public void process() {
  
      try {
  
  
          String server_id = rslt.getString("server_id");
          target2 = rslt.getString("target");
          threat_level = rslt.getInt("threat_level");
          int client_id = rslt.getInt("client_id");
          String attacker = rslt.getString("attacker");
          String num_this_attack = rslt.getString("num_this_attack");
          details = "Target IP: " + target2 + " Server ID: " + server_id + " Client ID: " + client_id + " Threat Level: " + threat_level  + " Attacker IP: " + attacker + " Number of attacks: " + num_this_attack;
  
  
          System.out.println(details);
  
  
      } catch (SQLException e) {
  
          e.printStackTrace();
      }
  }
  public String getTraget2() {
      return target2;
  }
  </code></pre>
  
  <p>}</p>
  
  <p>Update: I should mention that I have a while loop in another class that properly reads through each record.</p>
  
  <p>Update 2: Here is the main class, I am not concerned with the GUI elements right now:</p>
  
  <pre><code>public class MainDisplay extends JFrame {
  
  static Toolkit tk = Toolkit.getDefaultToolkit();
  static int Width = (int)tk.getScreenSize().getWidth();
  static int Height = (int)tk.getScreenSize().getHeight();
  
  public static JFrame frame = new JFrame();
  public static JLayeredPane lpane = new JLayeredPane();
  public static String target;
  </code></pre>
  
  <p>public static void main (String[] args) {
      new MainDisplay();</p>
  
  <p>}</p>
  
  <p>public MainDisplay() {</p>
  
  <pre><code>frame.setPreferredSize(new Dimension(Width, Height));
  frame.setLocation(0,0);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setUndecorated(true);
  
  //NoRisk Run = new NoRisk();
  //Run.NoThreat();
  
  
  ThreatPanel Run = new ThreatPanel();
  Database Data = new Database();
  
  //Create Connection to Database and run query
  
  Data.createConnection();
  Data.getData();
      try {
          while(Data.rslt.next()){
              Data.process();
              Run.TargetServer = Data.getTraget2();
              System.out.print(Data.getTraget2()); //for testing purposes
              Run.ShowThreats();
              try {
                  Thread.sleep(1000*10); // sleeps for ten seconds
              } catch (InterruptedException e) {
  
                  e.printStackTrace();
              }
  
          }
      } catch (SQLException e) {
  
          e.printStackTrace();
      }
  
  //Run.ShowThreats();
  
  frame.setLayout(new BorderLayout());
  frame.add(lpane, BorderLayout.CENTER);
  lpane.setBounds(0,0, Width, Height);
  
  
  
  
  
  
  frame.pack();
  frame.setVisible(true);
  </code></pre>
  
  <p>}
  }</p>