2010-05-04 54 views
3

嘿傢伙們很快問題,我以爲我做的是正確的事情,但我一直得到錯誤的結果。我試圖簡單地在最短時間內找到條目的ID,但我沒有得到該條目。用最短時間值選擇字段信息

$qryuserscount1="SELECT id,min(entry_time) FROM scrusersonline WHERE topic_id='$topic_id'"; 
$userscount1=mysql_query($qryuserscount1); 
while ($row2 = mysql_fetch_assoc($userscount1)) { 
    echo $onlineuser= $row2['id']; 
} 

這是我的查詢,它不起作用。這對我來說沒有任何意義 SELECT id FROM scrusersonline WHERE topic_id ='$ topic_id'ORDER by entry_time LIMIT 1,任何人都可以快速指出我做錯了什麼嗎?

回答

2
SELECT id,min(entry_time) FROM scrusersonline WHERE topic_id='$topic_id' 

將返回identry_time的每一行匹配topic_id,由於沒有按......分組子句從中min(entry_time)可以選擇。 SELECT子句只定義要返回哪些,它不是限制按行選擇任何 - 這就是WHERE子句的用途。

SELECT id FROM scrusersonline WHERE topic_id='$topic_id' ORDER BY entry_time LIMIT 1 

將返回idSELECT id)用於當由entry_time排序(這是最低)僅第一LIMIT 1)匹配topic_idWHERE topic_id='$topic_id')。

所以,是的,SELECT id FROM scrusersonline WHERE topic_id='$topic_id' ORDER BY entry_time LIMIT 1是你在找什麼。

+0

謝謝pinkgothic,感謝您的時間 – Scarface 2010-05-04 13:07:06

1

我認爲min函數必須和group by子句一起使用。但是,您發佈的第二個請求會選擇完整的id列表,其中topic_id是您想要的,按entry_time排序(您可以添加一個ASC或DESC,使其最清晰),然後僅返回第一個。

它有什麼問題? :-)

+0

我只是想,如果我能夠正確地做到這一點,也許min是一種更有效的方式,但顯然這種意圖是無效的。 – Scarface 2010-05-04 12:36:44

1
SELECT id, MIN(entry_time) 
FROM scrusersonline 
WHERE topic_id='$topic_id' 

SQL標準,這個查詢是無效的。

您不能在SELECT列表中使用id列表,除非您使用GROUP BY它,因爲不清楚應該返回組中的哪個id

MySQL但是,允許這樣的查詢返回來自該組(從整個記錄集,如果沒有GROUP BY子句)的任何隨機id

此行爲旨在簡化PRIMARY KEYGROUP BY加入:

SELECT mytable.*, COUNT(*) 
FROM mytable 
JOIN othertable 
ON  othertable.col1 = mytable.id 
GROUP BY 
     mytable.id 

在這種情況下,從mytable所有記錄都保證集團內相同,不要緊哪一個將被退回。

您的查詢不會返回保存最小值entry_time的記錄。相反,它將返回滿足topic_id = $topic_id條件的最小值entry_time隨機id,該條件不保證屬於相同的記錄。

+0

非常感謝Quassnoi提供的豐富信息。我想我展示的第二種方式是我唯一的選擇,那麼正確嗎? – Scarface 2010-05-04 12:35:06

+2

@scarface:是的。如果你在'(topic_id,entry_time)'上創建一個複合索引,它可以做得更快。 – Quassnoi 2010-05-04 12:36:54

+0

非常感謝Quassnoi。 – Scarface 2010-05-04 13:06:14