2011-09-07 18 views
0

我有一個具有以下字段的表:在PHP中,如何讓mySQL數據庫檢索多個匹配特定值的最新記錄?

candy_name 
candy_type 
candy_amount 
candy_vendor 

一個candy_type可以有多個candy_names,像「橡皮糖那樣」可能有「橙」,「西瓜」,「西瓜酸味,」等等。

我正在做的是按供應商搜索此表,然後我想查看每個唯一的candy_type(忽略candy_name)的最新條目。即,每個獨特的candy_type最近添加的行。

於是我發現了怎麼辦有關該表中找到的所有獨特candy_types部分:

$sql = "SELECT DISTINCT candy_type FROM candy_table 
       WHERE candy_vendor LIKE '%$user_searchbox_input%' 
       ORDER BY candy_vendor ASC"; 
$result=mysql_query($sql); 

現在我需要找出如何檢索每個獨特candy_type的最新記錄。

就像「gummi」的candy_type一樣,如果最後一條匹配該類型的記錄是「orange」,那就是我想要看到的那個---而不是其他人。
對於「巧克力」的candy_type,如果最後一個匹配記錄是「牛奶」,我不關心其他人,但我想檢索與candy_type匹配的最新記錄。

我該怎麼做?

+0

你如何定義「最近的」?是最後添加的還是最後更新的?還是最後訪問的?你的表結構是什麼?你似乎沒有提供足夠的信息。 –

+0

@Aleks,你不需要那麼多的信息,傑裏可以對代碼進行自己的修改。最近的='有timestamp = max(timestamp)'所有OP需要做的就是重命名字段以適應他的數據庫模式。 – Johan

+0

@Aleks,最後添加的那些。 我並沒有想到它可能會引起誤解,我會改變我原來的帖子。謝謝! –

回答

1

如果您想要使用最新版本,請使用having子句和group by,因爲該組通過選擇不同的列,因此可以刪除distinct子句。

$user_searchbox_input = mysql_real_escape_string($user_searchbox_input); 
$sql = "SELECT candy_type FROM candy_table 
       WHERE candy_vendor LIKE '%$user_searchbox_input%' 
       GROUP BY candy_vendor 
       HAVING timeadded = MAX(timeadded) 
       ORDER BY candy_vendor ASC"; 
$result=mysql_query($sql); 

參見:http://www.techonthenet.com/sql/having.php

+0

我有一個candy_date字段...我應該使用它嗎?或者是「添加」一個我不知道的PHP/MYSQL的東西? –

+0

@Jerry,不錯,替代'timeadded'字段,不加'timeadded'就是我的發明。不過,如果它能夠得到應用,我可能會將其專利。 – Johan

+0

我認爲這會起作用;但對於HAVING子句,我怎麼說「爲candy_date選擇最大值」? –

0

不幸的是,從這些四列沒有說明哪條記錄是最近的路。

我會建議通過ALTER TABLE命令添加一個date_time列。如果需要,可以參考http://dev.mysql.com/doc/refman/5.1/en/alter-table.html獲取語法幫助。

這不會幫助您處理當前的查詢,但它將有助於以後的任何查詢。

+0

我確實有一個time_column,但不確定是否有必要,或者它是否可以檢查數據庫中最近的一行。 知道我已經有這樣一個已經填充了有用數據的列,現在是什麼? –

+0

如果您有一個時間列,並且它包含記錄插入的日期/時間,那麼我會執行以下操作:「SELECT FROM candy_table ORDER BY DESC LIMIT 1」。 – Cavachon

+0

如果PK是整數auto_increment,那麼這對於創建時間來說是一個相當不錯的向量,不需要時間戳字段。 – Johan

-1

通過create_date(ORDER BY)或任何創建時間戳記對數據進行排序,然後執行SELECT * FROM tbl LIMIT 1; #檢索第一行

+0

-1,甚至沒有關閉。 – Johan

相關問題