2012-03-18 29 views
3

我希望能夠更新具有最高ID的行。 問題是:我找不到任何優雅的解決方案來做到這一點。 這是迄今爲止我最好的嘗試:您可以在一個查詢中更新具有最高ID的行嗎?

$highestId = mysql_result(mysql_query('SELECT MAX(id) FROM stats'),0); 

mysql_query("UPDATE stats SET views = views +1 WHERE id = $highestId"); 

也許有有一個更好的方法比我想的。

  • 我跟蹤的看法量,每天
  • 我希望它自動遞增的最後一個(最高ID)天
  • 在晚上,我正在創建一個新的一天一個cronjob 。

任何有關如何解決這個問題的建議都是受歡迎的,即使它是一種完全不同的方法。

stats => id | views

回答

7

是:

UPDATE stats SET views = views +1 ORDER BY id DESC LIMIT 1 
+0

感謝您的快速響應!問題:使用DATE列的情況如何?或者這樣更有效率?我希望它儘可能輕。 – SuperSpy 2012-03-18 10:11:23

+0

我會說與最適合您的目標的解決方案,獲取日期或int值的差異不會做出任何明顯的差異。特別是當它每天只有一個查詢時。 :) – justanotherhobbyist 2012-03-18 10:26:40

+0

上述查詢將每天運行約10 000次。 (也沒那麼多))無論如何,奧克。 – SuperSpy 2012-03-18 10:37:57

1

你也可以排序編號遞減的結果,只是編輯的第一個結果。

編輯:太遲對不起。 :)

+0

無論如何感謝^^, – SuperSpy 2012-03-18 10:19:57

4

如果您沒有受到表格排序的限制,可以使用@ dev-null-dweller版本。或者你可以使用子查詢。

UPDATE stats SET views = views +1 WHERE id = (SELECT * FROM (SELECT MAX(id) FROM stats) id) 

您可以剖析兩種解決方案並查看哪種解決方案最適合您的情況。


我認爲以下將是您追蹤統計數據的最佳解決方案,不需要cronjob。

創建一個表有兩列

表:stats

列:stat_date(DATE)PRIMARY,views(INT)

然後運行查詢:

$query = "INSERT INTO stats(stat_date, views) VALUES('".date('Y-m-d')."', 1) ". 
     'ON DUPLICATE KEY UPDATE views = views + 1'; 

編輯:我以前建議DATETIME類型爲stat_date列,但很明顯,DATETIME對您而言並不合適,因爲您只需要一天的記錄而不是第二次。因此,我將DATETIME類型替換爲DATE

+2

我正要寫下MySQL不會讓你在同一個表上執行子查詢的更新,但是後來我發現你已經用另一個子查詢「隱藏」它了。聰明的把戲,它的作品! – 2012-03-18 10:11:02

+0

但會更有效率嗎?另外請注意,無論如何,我需要一個cronjob,因爲我將在一天結束時計算Android的數量等。這樣做不會延遲我的用戶在其userAgents上使用額外的%如%語句或strpos()。 – SuperSpy 2012-03-18 10:22:39

+1

@SuperSpy我還沒有將'DATETIME'作爲'PRIMARY KEY'與具有'INT'類型'AUTO_INCREMENT'的表進行比較。但是,從邏輯上講,我相信這會比獲取最大ID並更新記錄更快。再次,這是微小的優化步驟。他們陷入了不成熟的優化界限。 – Shef 2012-03-18 10:32:55

相關問題