2012-12-03 98 views
0

我目前有一個mysql聯合查詢,當通過命令行,PHP MyAdmin直接放入mysql或在Mysql編輯器(如Mysql Workbench)中運行時可以工作。當我通過我的PHP類運行查詢時,它返回兩個重複的行。PHP中的Mysql聯盟不返回正確的結果

查詢:

SELECT `n`.`draftrd`, `n`.`draftteam`, `n`.`nflteam`, `nt`.`logo`, 
    `nt`.`name`, `nt`.`nflcity`, 
    `p`.`class`, `p`.`first_name`, `p`.`last_name` 
FROM `players` as `p` 
LEFT JOIN `nfl` as `n` ON `p`.`playerid` = `n`.`playerid` 
LEFT JOIN `nflteams` as `nt` ON `n`.`nflteam` = `nt`.`nflid` 
WHERE `n`.`playerid` = 2007000001 
UNION 
SELECT `n`.`draftrd` as `draftRd`, `n`.`draftteam` as `draftTm`, `n`.`nflteam`, 
    `nt`.`logo`, 
    `nt`.`name` as `draftName`, `nt`.`nflcity` as `draftCity`, `p`.`class`, 
    `p`.`first_name`, `p`.`last_name` 
FROM `players` as `p` 
LEFT JOIN `nfl` as `n` ON `p`.`playerid` = `n`.`playerid` 
LEFT JOIN `nflteams` as `nt` ON `n`.`draftteam` = `nt`.`nflid` 
WHERE `n`.`playerid` = 2007000001 

在它返回編輯:

+---------+-----------+---------+-------------+---------+----------+-------+------------+-----------+---------+ 
| draftrd | draftteam | nflteam | logo  | name | nflcity | class | first_name | last_name | tableid | 
+---------+-----------+---------+-------------+---------+----------+-------+------------+-----------+---------+ 
| 2  | 2   | 12  | giants.png | Giants | New York | 2007 | Martellus | Bennett |  1 | 
| 2  | 2   | 12  | cowboys.png | Cowboys | Dallas | 2007 | Martellus | Bennett |  1 | 
+---------+-----------+---------+-------------+---------+----------+-------+------------+-----------+---------+ 
2 rows in set (0.00 sec) 

PHP的回報是: (該版本的var_dump)

array(18) { 
    [0]=> string(1) "2" 
    ["draftrd"]=> string(1) "2" 
    [1]=> string(1) "2" 
    ["draftteam"]=> string(1) "2" 
    [2]=> string(2) "12" 
    ["nflteam"]=> string(2) "12" 
    [3]=> string(10) "giants.png" 
    ["logo"]=> string(10) "giants.png" 
    [4]=> string(6) "Giants" 
    ["name"]=> string(6) "Giants" 
    [5]=> string(8) "New York" 
    ["nflcity"]=> string(8) "New York" 
    [6]=> string(4) "2007" 
    ["class"]=> string(4) "2007" 
    [7]=> string(9) "Martellus" 
    ["first_name"]=> string(9) "Martellus" 
    [8]=> string(7) "Bennett" 
    ["last_name"]=> string(7) "Bennett" 
} 

我不知道問題是什麼以及爲什麼它不能正常工作。我試圖創建一個臨時表並將查詢存儲在它中,但它仍然給我重複的行。有沒有更簡單的方法來做到這一點或解釋爲什麼發生?我已經將查詢轉儲到PHP中,以查看問題是否與構造有關,但轉儲的查詢返回了我在命令行上運行時查找的行。

+0

請嘗試格式化一遍... –

+0

是啊,它肯定是在第一次運行難看。哈哈 – atxpunkrock

+1

我不明白你說的「它是重複的」,如果你的意思是你有[3] => string(10)「giants.png」和[「logo」] => string(10) 「giants.png」這是因爲你可以使用數字索引(例如result [3])或文本索引(例如result [「logo」])訪問查詢結果 – Rafael

回答

1

PHP中的MySQL句柄允許您以不同的方式遍歷結果數組。例如,您可以選擇通過鍵遍歷關聯數組(例如:echo $result['draftteam'];),也可以通過普通數組(例如:echo $result[2];)按索引進行迭代。

當您使用fetch_array()命令時,默認情況下,您同時獲取這兩種類型。這會產生你提供的文件。

如果你想創建一個基於關查詢的動態表(即:一個清空它的內容到下面的<td>年代以前在<th>寫入每個列名),那麼你就應該使用fetch_assoc()命令,而比fetch_array()命令。這隻會返回數組中的文本鍵。

while($arr = mysqli_fetch_assoc($sql)) { 
    foreach($arr as $key => $value){ 
     echo $key .' => '. $value .'<br />'."\n"; 
    } 
} 

http://php.net/manual/en/mysqli-result.fetch-assoc.php

http://php.net/manual/en/mysqli-result.fetch-array.php

+1

謝謝你。它清除了我對返回數組的一些誤解。我知道這兩種類型,但沒有意識到它會返回每個查詢,除非指定。雖然它並沒有完全回答我的問題,但它確實讓我意識到了這一點。我有一個函數返回mysql_fetch_array而不是mysql_query,所以它只返回第一個結果。我返回查詢,它提供了我正在查找的所有信息。我必須考慮返回這些信息的最佳方法,因爲我確定返回mysql_query不是最好的選擇。 – atxpunkrock