2016-12-06 17 views
-2

このコードはありますが、これは大丈夫ですが、whileループを使わずに、簡単なクエリでよりうまくいくことができます。私はORDER BYの日付とGROUP BYのユーザーIDでそれを作ろうとしましたが、私はいつも間違った日付を取得します。あなたは私にあなたの解決策を教えてくれますか?私が持っているもの厥SQL - Order by - Group by - Distinct

$abfrage1 = "SELECT DISTINCT userid FROM updates WHERE city='Berlin'"; 
$ergebnis1 = mysql_query($abfrage1); 

if($ergebnis1 == TRUE) 
{ 
    $menge1 = mysql_num_rows($ergebnis1); 
    if($menge1 != 0) 
    { 
     while($row1=mysql_fetch_object($ergebnis1)) 
     { 
      $abfrage2 = "SELECT * FROM updates WHERE userid='$row1->userid' ORDER BY date DESC LIMIT 1"; 
      $ergebnis2 = mysql_query($abfrage2); 

      if($ergebnis2 == TRUE) 
      { 
       $menge2 = mysql_num_rows($ergebnis2); 
       if($menge2 != 0) 
       { 
        $row2=mysql_fetch_object($ergebnis2); 

        echo "$row2->id - $row2->userid - $row2->text - $row2->date<br>"; 
       } 
      }   
     }  
    } 
} 

IAMのはそのような何かを探しているが、常に間違った日付を取得し、私が言ったように:

SELECT * FROM updates WHERE city='Berlin' GROUP BY userid ORDER BY date 

または

SELECT * FROM (SELECT * FROM updates WHERE city='Berlin' ORDER BY date DESC) as temp_info GROUP BY userid 

EDIT : だから、私はすべてのユーザーから最後のアクティビティを取得したいが、最後のアクティビティのみを取得したい。 ユーザーはLIMIT 1、ただし無制限のユーザー。だから私はそのユーザーからの最後のアクティビティを取得するために、最初にORDER BY日付をDISTINCT(OR GROUP BY)したいので、ユーザーごとに1つの結果しか得られません。 私はtry by order by - Group by - 独特な、しかし、私はいつも間違った日付と間違った活動を得る。サブクエリを使用しようとしても、GROUP BYはORDER BYを殺すようです。 GROUP BYはORDER BY日付DESCを無視しているようです。 ユーザーごとに1つのアクティビティが表示されますが、最後のアクティビティはありません。 GROUP BY useridは、最初のORDER BY日付とは無関係に、そのユーザーからの最初のエントリ(id)を単独で受け取ります。

id userid  date  text 
01 01  2015-04-14  bla 
02 01  2015-04-15  bla 
03 02  2015-04-16  bla 
04 01  2015-04-17  bla 
05 02  2015-04-18  bla 
06 02  2015-04-19  bla 
07 02  2015-04-20  bla 
08 03  2015-04-21  bla 
09 01  2015-04-22  bla 
10 01  2015-04-23  bla 

What i want: 
10 01  2015-04-23  bla 
08 03  2015-04-21  bla 
07 02  2015-04-20  bla 

But this is what i get: 
01 01  2015-04-14  bla 
03 02  2015-04-16  bla 
08 03  2015-04-21  bla 

私はORDER BYのIDとORDER BYのIDを試しましたが、GROUP BYのユーザーIDは自分の考えをします。

ありがとうございました!最終的な解決策:

SELECT u1.* FROM updates u1 JOIN 
(SELECT MAX(id) as tempid, userid FROM updates WHERE city='Berlin' GROUP BY userid) 
u2 ON u1.id = u2.tempid ORDER BY u1.datum DESC 
+0

URようこそ!!!!! – Hogan

+0

(私たちが問題の原因を知る手伝いをするためには、日付が間違っているとは言いますが、どのように、何を期待しているのか、入力が何であるかなどは決して言わないでください。答えることができる質問をしてください。) – Hogan

+0

私は自分の投稿を編集しましたので、私は何が必要なのかをより明確にしました! – Exo

答えて

1

派生テーブルを使用して、各ユーザーの最新の活動のIDと日付を取得します。 JOINこれを更新テーブルに戻して、そのアクティビティに関連する行を取得します。

SELECT u1.* 
FROM updates u1 
JOIN (SELECT MAX(id) AS id , userid, MAX(date) as date FROM Updates GROUP BY userid) u2 
    ON u1.id = u2.id and u1.date = u2.date 

これはあなたの例に基づいて仮定であるが、技術的にはユーザーごとに最大idを得ていないだろうことは、最新のアクティビティを取得することと同じこと?もしそうなら、コードを少し短くしてMAX(date)個を取り除くことができます。

SELECT u1.* 
FROM updates u1 
JOIN (SELECT MAX(id) as id, userid FROM Updates GROUP BY userid) u2 
    ON u1.id = u2.id 
+0

THX!それを試してみよう! – Exo

+0

これはうまくいきません!それは言う: #1054 - 不明な列 'u2。id 'on' clause ' – Exo

+0

MAX(id)をtempidとして選択 – Exo