2014-02-24 46 views
1

在我的網站上,用戶可以從32名玩家中選出一名玩家。首發陣容有15個陣容,因此需要選出32名球員陣容中的15名球員。SQL查詢返回錯誤結果

1播放器可以播放一個以上的位置,你可以在下面的圖片中看到:

enter image description here

現在,當用戶選擇了起跑線起來了隊內某些球員的名字,可以播放的超過1個位置(如上圖中)需要兩個位置顯示出來,不幸的是這是行不通的,你可以在下面的圖片中看到:

enter image description here

如果你看圖1,你可以看到Badden Kerr可以同時彈奏flyhalf和後衛。

的問題

在選擇列表中的玩家的次要地位不出來。作爲一個例子如果你再次看圖1,你可以看到Badden Kerr可以同時播放flyhalf和fullback。但第二圖像中後衛位置是空的,巴登Kerrs的名字沒有出現在他的次要位置(後衛)


當我運行在phpMyAdmin以下SQL statment:

SELECT * 
FROM `allsquads` 
WHERE `Team` = 'Blues' 
AND `Position` = 'flyhalf' 
AND `Secondary` = 'fullback' 

我得到正確的結果返回,你可以在下面的圖片中看到: enter image description here

然而,當我試圖在我的PHP代碼運行相同的SQL statment它給了我錯了/不想要的結果(正如你可以看到圖像2)

我的PHP代碼如下:

// assign each position to array variable position 
     $position = array(
      "prop", 
      "hooker", 
      "prop", 
      "lock", 
      "lock", 
      "flank", 
      "flank", 
      "no8", 
      "scrumhalf", 
      "flyhalf", 
      "center", 
      "center", 
      "wing", 
      "wing", 
      "fullback" 
     ); 
     // for loop to loop through the number of positions in the team, which will be used to query DB 
     $size  = sizeof($position); 
     for ($i = 0; $i < $size; $i++) { 
      // Query For positions 
      $sqlprops = mysql_query("SELECT * FROM `allsquads` 
            WHERE `Team` = '$t1select' 
            AND `Position` = '$position[$i]' 
            OR `Secondary` = '$position[$i]'") or die(mysql_error()); 

新問題 當我做下面的查詢

SELECT * FROM `allsquads` 
           WHERE `Team` = '$t1select' 
           AND `Position` = '$position[$i]' 
           OR `Secondary` = '$position[$i]'") or die(mysql_error()); 

查詢現在顯示在兩個他們的位置上的球員,但它顯示其他玩家誰不在選拔隊伍中?

任何幫助或建議將不勝感激

預先感謝您

+1

在您的查詢,這將轉化爲:'SELECT * FROM allsquads WHERE隊= '$ t1select' 和位置= 'flyhalf' 和二級=「flyhalf'',這就是它不工作 –

+0

的原因@ICanHasCheezburger任何機會,你可以用PHP查詢指向我的正確方向 – Marilee

+0

當我將其更改爲:'SELECT * FROM allsquads WHERE Team ='$ t1select' AND Position ='flyhalf' OR Secondary ='flyhalf' 「我得到正確的結果,但它顯示其他球隊的球員,以及......? – Marilee

回答

3

你在PHP代碼查詢,因爲你必須將它設置PositionSecondary相同的值不會產生預期的結果。根據您提供的樣本數據不會返回任何內容。

如果你正在尋找一個查詢以選擇dropdwon合格玩家可以更改查詢看起來像這樣:

SELECT * FROM `allsquads` 
WHERE `Team` = '$t1select' 
AND (`Position` = '$position[$i]' OR `Secondary` = '$position[$i]') 
+0

@Durandai謝謝你的回答,我只是這麼做的,但是它會返回來自其他球隊的球員的結果以及...... – Marilee

+0

@Marilee只要你還有一個'Team',它應該將它過濾爲只有團隊 – Durandal

+0

@Durandi我知道,但它沒有意義,因爲它顯示其他球隊的球員...... – Marilee

1

你應該優化數據庫結構。雖然有辦法解決你的問題,但我認爲最好是規範你的表格,這樣你就可以得到一張表格和一張具有玩家ID和可能位置的表格(如果你真的在乎這是主要或次要的位置,您也可以爲此添加一個字段)。

所以你players表將

 
╔═══════════╦═════════════╗ 
║ player_id ║ player_name ║ 
╠═══════════╬═════════════╣ 
║ 1   ║ John Doe ║ 
╚═══════════╩═════════════╝ 

另外如果需要更多;從閱讀這個問題來看,你的結構的其餘部分並不清楚。該positions表將是:

 
╔═══════════╦═══════════╦═══════════╗ 
║ player_id ║ position ║ role  ║ 
╠═══════════╬═══════════╬═══════════╣ 
║ 1   ║ flyhalf ║ primary ║ 
║ 1   ║ fullback ║ secondary ║ 
╚═══════════╩═══════════╩═══════════╝ 

然後找到誰玩flyhalf所有玩家,你會查詢select `players`.`player_name` from `players`,`positions` where `positions`.`position` = "flyhalf" and `players`.`player_id`=`position`.`plr_id`

此外,你可以(並且可能應該)正常化的位置名稱到另一個表,所以positions.position是整數引用表possible_positions

 
╔════════╦═══════════╗ 
║ pos_id ║ position ║ 
╠════════╬═══════════╣ 
║ 1  ║ flyhalf ║ 
║ 2  ║ fullback ║ 
╚════════╩═══════════╝ 

此外,這樣做,可以讓你保持在數據庫和數據庫查詢拉特可能位置的列表而不是像現在那樣硬編碼到PHP數組中。

至少,這應該讓你開始。數據庫規範化並從一開始就具有適當的結構可能會對構建這些查詢有很大的幫助。