2011-03-18 97 views
0

我有一個MySQL查詢從數據庫中提取,該數據庫包含我的站點上一小組註冊用戶使用的簡單Web表單的結果。只有3個字段被拉出,並通過「姓名」(用戶名),「數據」(其他用戶輸入數據)和「錄製時間」(提交時間/日期)在查詢中表示。目標是在結果網頁表中僅顯示7個用戶中每個用戶的最新條目。我有3個查詢版本在不同程度上工作,但沒有完全正確。出於某種原因,所有3都省略了第一個(按字母順序排列的用戶名)條目。無需根據預期對列表進行排序以在表格的頂部顯示最新的用戶輸入(按日期/時間)(按日期/時間從那裏下降)。示例#1效果最好,但按用戶名按字母順序排序。 #2和#3的行爲非常相似,但在最上面顯示最新的用戶條目(所有用戶),然後按字母順序排列剩餘的用戶名。我可以讓所有合法用戶條目顯示的唯一方法是創建了假用戶「1A」並提交了一個條目。只要它佔據了第一個(按字母順序排列的用戶名)條目,剩餘的條目就會顯示在顯示網格上。如果您對其他查詢邏輯策略有任何想法,我會很感激您的想法。謝謝,邁克需要查詢邏輯建議


1. This version 8.01 returns all user entries except the first alphabetical username and sorts by username. 
$myquery = " 
    SELECT 
     name 
     , data 
     , recordtime 
    FROM 
     (
      SELECT 
       * 
      FROM 
       {$conf->website_db}.userform_db 
      ORDER BY 
       recordtime DESC 
     ) AS x 
    GROUP BY 
     name 
"; 

2. This version 8.02 returns all user entries except the first alphabetical username and sorts by username, 
    except places the most recent entry (of all users) at the top of the list. 
$myquery = " 
    SELECT 
     m1.* 
    FROM 
     {$conf->website_db}.userform_db m1 
    LEFT JOIN 
     {$conf->website_db}.userform_db m2 
    ON (m1.name = m2.name AND m1.recordtime website_db}.userform_db a, 
      (SELECT name, MAX(recordtime) AS Date 
       FROM {$conf->website_db}.userform_db 
        GROUP BY name) b 
    WHERE a.name = b.name 
     AND a.recordtime = b.Date 
"; 

3.This version is 8.03 returns all user entries except the first alphabetical username and sorts by username, 
    except places the most recent entry (of all users) at the top of the list (same as v2). 
$myquery = " 
    SELECT 
     a.name, a.data, a.recordtime 
    FROM 
     {$conf->website_db}.userform_db a, 
      (SELECT name, MAX(recordtime) AS Date 
       FROM {$conf->website_db}.userform_db 
        GROUP BY name) b 
    WHERE a.name = b.name 
     AND a.recordtime = b.Date 
"; 

回答

0

嘗試:

SELECT 
    udb.name 
    , data 
    , recordtime 
FROM userform_db udb 
JOIN (select name,max(recordtime) as rtime from userform_db group by name) tmp on udb.name=tmp.name and udb.recordtime=tmp.rtime 
+0

感謝您的意見。此查詢導致錯誤「字段列表中的列名稱」不明確「 – user641472 2011-03-18 19:16:09

+0

yah .. it; s udb.name there – 2011-03-18 19:21:36

0

這SQL應該工作:

SELECT m.name,f.`data`,m.recordtime 
FROM 
{$conf->website_db}.userform_db f, 
(SELECT name,max(recordtime) mrt 
    FROM {$conf->website_db}.userform_db 
    GROUP BY name) m 
WHERE 
f.name=m.name AND f.recordtime=m.mrt 
ORDER BY 
m.name 

這是接近你的8.03。在缺乏第一項問題聽起來更像是一個數據一致性問題......如果你運行:

SELECT name,max(recordtime) mrt 
FROM {$conf->website_db}.userform_db 
GROUP BY name 

就其本身而言,你得到的每一行的名稱和最大值?

+0

感謝您的輸入。當我運行你的測試時,我得到了與我提交的3相似的結果。即,用戶輸入「1A」不顯示。你能詳細闡述可能的數據一致性原因嗎? – user641472 2011-03-18 18:20:31

+0

根據[手冊](http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_max),如果沒有匹配的行,MySQL會返回null ...什麼輸出你是從'SELECT name,recordtime FROM {$ conf-> website_db} .userform_db WHERE name ='1A''? – Rudu 2011-03-21 16:55:29

0
SELECT uf.* 
FROM (
     SELECT DISTINCT name 
     FROM userform_db 
     ) ufd 
JOIN userform_db uf 
ON  uf.id = 
     (
     SELECT id 
     FROM userform_db ufi 
     WHERE ufi.name = ufd.name 
     ORDER BY 
       ufi.name DESC, ufi.recordtime DESC, ufi.id DESC 
     LIMIT 1 
     ) 
ORDER BY 
     uf.recordtime DESC