[英]PHP and MySQL showing different results with same query
我有一個MySQL查詢,當直接在本地MySQL數據庫上執行時,它運行正常,但通過PHP執行時,顯示的結果卻不同。
SELECT a.id, a.title, a.public, a.sysstamp, a.password, t.thumbURL, t.count
FROM 0_lychee_albums AS a
LEFT JOIN (SELECT id, album, thumbURL,
@num := IF(@group = album, @num + 1, 0) AS count,
@group := album AS dummy
from 0_lychee_photos
WHERE album != 0
ORDER BY album, star DESC) AS t ON a.id = t.album
WHERE count <= 2 OR count IS NULL;
或單線:
SELECT a.id, a.title, a.public, a.sysstamp, a.password, t.thumbURL, t.count FROM 0_lychee_albums AS a LEFT JOIN (SELECT id, album, thumbURL, @num := IF(@group = album, @num + 1, 0) AS count, @group := album AS dummy FROM 0_lychee_photos WHERE album != 0 ORDER BY album, star DESC) AS t ON a.id = t.album WHERE count <= 2 OR count IS NULL;
結果:
| id | title | public | sysstamp | password | thumbURL | count |
| 71 | [Import] 01 | 0 | 1415091268 | NULL | cad008943372d984a9b74378874128f8.jpeg | 0 |
| 72 | [Import] 9n401238 | 0 | 1415091268 | NULL | 7b832b56f182ad3403521589e2815f67.jpeg | 0 |
| 72 | [Import] 9n401238 | 0 | 1415091268 | NULL | f058f379ce519f1d8a2ff8c0f5003631.jpeg | 1 |
| 72 | [Import] 9n401238 | 0 | 1415091268 | NULL | a4d59377bed059e3f60cccf01a69c299.jpeg | 2 |
| 73 | Untitled | 0 | 1415114200 | NULL | NULL | NULL |
PHP結果:
| id | title | public | sysstamp | password | thumbURL | count |
| 71 | [Import] 01 | 0 | 1415091268 | NULL | cad008943372d984a9b74378874128f8.jpeg | 0 |
| 72 | [Import] 9n401238 | 0 | 1415091268 | NULL | 7b832b56f182ad3403521589e2815f67.jpeg | 0 |
| 72 | [Import] 9n401238 | 0 | 1415091268 | NULL | f058f379ce519f1d8a2ff8c0f5003631.jpeg | 0 |
| 72 | [Import] 9n401238 | 0 | 1415091268 | NULL | a4d59377bed059e3f60cccf01a69c299.jpeg | 0 |
| 72 | [Import] 9n401238 | 0 | 1415092318 | NULL | 7b832b56f182ad3403521589e2815f67.jpeg | 0 |
| 72 | [Import] 9n401238 | 0 | 1415092369 | NULL | cad008943372d984a9b74378874128f8.jpeg | 0 |
| 72 | [Import] 9n401238 | 0 | 1415092369 | NULL | 84030a64a1f546e223e6a46cbf12910f.jpeg | 0 |
| 73 | Untitled | 0 | 1415114200 | NULL | NULL | NULL |
a) count
沒有增加
b)由於a)它顯示的行數超過了應有的行數(應限制為每個id 3行)
我多次檢查,兩個查詢完全相同。 沒有用戶輸入或PHP中沒有任何區別。
我已經檢查過類似的問題 ,但沒有一個有幫助。 以下查詢在MySQL和PHP上顯示相同的結果:
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
有誰知道這個差異的問題嗎?
編輯更多信息:
$database = new mysqli($host, $user, $password, $database);
$query = "SELECT a.id, a.title, a.public, a.sysstamp, a.password, t.thumbURL, t.count FROM 0_lychee_albums AS a LEFT JOIN (SELECT id, album, thumbURL, @num := IF(@group = album, @num + 1, 0) AS count, @group := album AS dummy FROM 0_lychee_photos WHERE album != 0 ORDER BY album, star DESC) AS t ON a.id = t.album WHERE count <= 2 OR count IS NULL";
$albums = $database->query($query);
while ($album = $albums->fetch_assoc()) { print_r($album); }
在執行查詢之前,我還嘗試了以下操作:
$database->set_charset('utf8');
$database->query('SET NAMES utf8;');
對。 不能保證select
子句中表達式的求值順序。 因此,變量分配可以以不同的順序發生,具體取決於調用查詢的方式。
您可以通過將所有變量分配放在單個表達式中來解決此問題。 嘗試對t
使用此子查詢:
(SELECT id, album, thumbURL,
(@num := IF(@group = album, @num + 1,
if(@group := album, 0, 0)
)
) as count
FROM 0_lychee_photos CROSS JOIN
(SELECT @num := 0, @group := NULL) vars
WHERE album <> 0
ORDER BY album, star DESC
) t
文檔中的具體說明是:
通常,除了在SET語句中,永遠不要為用戶變量分配值,並且不要在同一條語句中讀取該值。 例如,要增加變量,可以:
SET @a = @a + 1;
對於其他語句,例如SELECT,您可能會得到期望的結果,但這不能保證。 在下面的語句中,您可能認為MySQL將首先評估@a,然后再進行賦值:
SELECT @a, @a:=@a+1, ...;
但是,涉及用戶變量的表達式的求值順序是不確定的。
解決此問題的一種簡單方法是在PHP文檔中設置變量mysql。 像這樣:$ var = mysql_query(“ SET @nun:= 0;”);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.