2014-01-06 39 views
1

我想簡化我的代碼,將選擇邏輯從Java移動到MySQL並且還想將兩個查詢簡化爲一個。MySQL添加條件邏輯和組合SELECT

我有player_id_1列的兩個表marriage_dataplayer_id_2 然後,我有player_dataplayer_id列和username

鑑於從方法的整數,我想搜索在player_id_1marriage_dataplayer_id_2的比賽

如果我在player_id_1找到一場比賽,我想獲得player_id_2 如果我在player_id_2找到一場比賽,我想獲得player_id_1

與ID檢索到的,我想選擇player_datausername當檢索到的ID等於player_id

目前我使用這個代碼讓我期望的結果:

private String getSpouse(Connection conn, int id) throws SQLException { 
    try (PreparedStatement ps = prepare(conn, "SELECT * FROM `marriage_data` WHERE `player_id_1` = ? OR `player_id_2` = ?", id, id)) { 
     ResultSet marriageData = ps.executeQuery(); 
     while (marriageData.next()) { 
      int one = marriageData.getInt("player_id_1"); 
      int two = marriageData.getInt("player_id_2"); 
      if (one > 0 && two > 0) { 
       int spouseId = one != id ? one : two; 
       try (PreparedStatement ps2 = prepare(conn, "SELECT * FROM `player_data` WHERE `player_id` = ?", spouseId)) { 
        ResultSet rs2 = ps2.executeQuery(); 
        while (rs2.next()) { 
         return rs2.getString("username"); 
        } 
       } 
      } 
     } 
    } 
    return null; 
} 

我真的需要從這個混亂的java + 2mysql查詢轉移到單個MySQL查詢。任何指導或協助將不勝感激。

編輯:

`player_data` structure 
+-----------------+------------------+------+-----+---------+----------------+ 
| Field   | Type    | Null | Key | Default | Extra   | 
+-----------------+------------------+------+-----+---------+----------------+ 
| player_id  | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| username  | varchar(32)  | NO |  | NULL |    | 

`marriage_data` structure 
+-------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+-------------+------------------+------+-----+---------+----------------+ 
| id   | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| player_id_1 | int(11)   | NO | MUL | NULL |    | 
| player_id_2 | int(11)   | NO |  | NULL |    | 
+-------------+------------------+------+-----+---------+----------------+ 

Sample data from `player_data` 
+-----------+-------------+ 
| player_id | username | 
|  48616 | player2 | 
+-----------+-------------+ 
| player_id | username | 
|  69054 | player1 | 

Sample data from `marriage_data` 

+-----+-------------+-------------+ 
| id | player_id_1 | player_id_2 | 
+-----+-------------+-------------+ 
| 233 |  48616 |  69054 | 
+-----+-------------+-------------+ 

在所提供的示例:

鑑於48616它應該返回PLAYER1

鑑於69054它應該返回player2

+0

好極了。請參閱JOIN。 – Strawberry

+0

請提供您的表結構的一些樣本數據和預期的結果,我會給你查詢 –

+0

@ user3130834 - 檢查我的答案。其工作 –

回答

0

使用以下查詢。將ENTER_YOUR_PLAYERID_HERE替換爲您的輸入播放器ID

select m.player_id_1 as 'original_player_name',m.player_id_2 as 'matched_player' ,p.username as 'input_user_name', 
(select username from player_data where player_id=matched_player) as 'matched_player_name' 
from marriage_data m inner join player_data p on p.player_id=m.player_id_1 
and m.player_id_1=ENTER_YOUR_PLAYERID_HERE 
union 
select m.player_id_2 as 'original_player_name',m.player_id_1 as 'matched_player' ,p.username as 'input_user_name', 
(select username from player_data where player_id=matched_player) as 'matched_player_name' 
from marriage_data m inner join player_data p on p.player_id=m.player_id_2 
and m.player_id_2=ENTER_YOUR_PLAYERID_HERE 
+0

避免字段名稱中的空格 –

+1

@leonardo_assumpcao - 意外添加空間,現在刪除它。感謝您的留言 –

0

基於代碼,它看起來像你可以這樣做:

SELECT * FROM `marriage_data` AS md 
    JOIN `player_data` AS pd1 ON pd1.player_id = md_player_id_1 
    JOIN `player_data` AS pd2 ON pd2.player_id = md_player_id_2 
WHERE `md.player_id_1` = ? OR `md.player_id_2` = ? 

基本上,加入marriage_dataplayer_data兩次,一次爲玩家1,再次爲玩家2.請記住,這可能需要一些tweeking。你真的不應該做SELECT *,但由於你沒有顯示任何表結構,我不知道那裏有什麼列。而不是SELECT *你應該只指定你需要的列。此外,您可能會得到不明確的列,這會引發錯誤。

使用新的組合SELECT,您應該能夠將您的WHILE循環簡化爲可捕捉所有內容的單個循環。