我有以下MySql表。UNION ALL運算符的意外行爲
表tblUsg
這樣定義:
CREATE TABLE `tblUsg` (
`id` INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`ip` VARCHAR(46) NOT NULL,
`dtm` DATETIME NOT NULL,
`huid` BINARY(32) NOT NULL,
`licnm` VARCHAR(20) NOT NULL,
`lichld` VARCHAR(256) NOT NULL,
`flgs` INT NOT NULL,
`agnt` VARCHAR(256),
INDEX `ix_huid` (`huid`),
INDEX `ix_licnm` (`licnm`),
UNIQUE KEY `ix_lichuid` (`huid`, `licnm`)
) AUTO_INCREMENT=0 CHARACTER SET utf8 COLLATE utf8_unicode_ci;
而且表tblLics
這樣定義:
CREATE TABLE `wosLics` (
`id` INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`licnm` VARCHAR(20) NOT NULL,
`desc` VARCHAR(256) NOT NULL,
`maxcpy` INT NOT NULL,
`dtmFrom` DATETIME,
`dtmTo` DATETIME,
`stat` INT NOT NULL,
UNIQUE KEY `ix_licnm` (`licnm`)
) AUTO_INCREMENT=0 CHARACTER SET utf8 COLLATE utf8_unicode_ci;
我然後調用下面的PHP腳本時,比方說,兩個表是空的:
$link = @mysql_connect($HOSTNAME, $USERNAME, $PASSWD);
@mysql_select_db($DBNAME);
mysql_set_charset('utf8', $link);
$res = @mysql_query(
"SELECT `maxcpy`, `stat`, `dtmFrom`, `dtmTo` FROM `tblLics` WHERE `licnm`='zbcdefghijklmnopqrsu'\n".
"UNION ALL\n".
"SELECT COUNT(*), NULL, NULL, NULL FROM `tblUsg` WHERE `licnm`='zbcdefghijklmnopqrsu'\n".
"UNION ALL\n".
"SELECT COUNT(*), NULL, NULL, NULL FROM `tblUsg` WHERE (`licnm`='zbcdefghijklmnopqrsu' AND `huid`='a871c47a7f48a12b38a994e48a9659fab5d6376f3dbce37559bcb617efe8662d')"
, $link);
if($res)
{
$row0 = @mysql_fetch_row($res);
$row1 = @mysql_fetch_row($res);
$row2 = @mysql_fetch_row($res);
echo("<br/>0::<br/>");
var_dump($row0);
echo("<br/>1::<br/>");
var_dump($row1);
echo("<br/>2::<br/>");
var_dump($row2);
}
其中輸出:
0::
array(4) { [0]=> string(1) "0" [1]=> NULL [2]=> NULL [3]=> NULL }
1::
array(4) { [0]=> string(1) "0" [1]=> NULL [2]=> NULL [3]=> NULL }
2::
bool(false)
我的問題是,爲什麼我的$row2
是false
當$row1
是因爲我會一直期待的陣列?
是嗎?你有沒有滿足第一個查詢中的where條件的記錄?對於空結果和兩個記錄集,每個記錄有1條記錄,您的預期輸出是什麼? – Pred
@Pred:不,表格最初是空的。在那種情況下,我希望我的'$ row0'是'false'。情況並非如此嗎? – c00000fd
爲什麼?空+某物=某物。 SQL不會僅僅因爲你在某個地方有一個空集而重新索引結果。 SQL應該如何知道第一個查詢是否應該返回1或2或者沒有或10k記錄?它應該在何處重新索引記錄(並在第一條記錄之前填寫所有內容)? – Pred