2016-05-02 5 views
3

を持っているかどうかを確認します。私には4つのフィールドがあります。実際の数値評価php mysqlベンダーが私のソフトウェアの評価表に

を評価評価 の IDの自動インクリメント rvidのベンダーID ratedate日、私は最後の数ヶ月かけてそれをたくさん行っているが、今回のイムは困惑し、私は私の頭の中で鮮明な画像を得るカントこれを行う最善の方法。私がしようとしているのは、ベンダーが3つの低い「連続」レーティングを持っているかどうかを調べることです。彼らの最後の3つの評価が< 3なら、私はそれらにフラグを立てたい。

私はこれで数時間プレイしていますので、私は(答えではなく)尋ねると思っていましたが、私を前方に押していく道の方向については、ここで円になっていました。

私はGROUP BYといくつかのORDER BYを試しましたが、これらの試みはうまくいっていないので、これはMySQLの答えではなくPHPの答えであるのだろうかと思います。言い換えれば、私はちょうど私がこれまで持っているものを取って、usortなどを介して物事のPHP側に移動し、そのようにする必要があります。

これまで私がこれまでに持っていたことは、最初に考えていたのが最後のコンセプシブを得るための最善の方法だと思っていましたが、私は小さな進歩を遂げました。問題なので、私はそれを質問から取り出しました。私に与える

$sql = "SELECT `rvid`, `rating` FROM `vendor_ratings_archive` WHERE `rating` <= '3' ORDER BY `rvid` DESC"; 

この

Array 
(
[0] => Array 
    (
     [rvid] => 7 
     [rating] => 2 
    ) 

[1] => Array 
    (
     [rvid] => 5 
     [rating] => 1 
    ) 

[2] => Array 
    (
     [rvid] => 5 
     [rating] => 0 
    ) 

[3] => Array 
    (
     [rvid] => 5 
     [rating] => 3 
    ) 

) 

これは私がフィールドに投げただ単にサンプルで、ライブのように、それは、行のトンになりますここでの唯一の4行があります。しかし、基本的に、これは、これらのベンダーが低い評価を得ていることを示しています。そして、それが私が酷使されるところです。私はクエリで1つの並べ替えしか行うことができないので、私はこれを取る必要があり、それを終了するためにPHP側に移動する必要があると思っている理由です。

私はphpでrvidで要素を並べ替える必要があると思います。まず、3つの要素が同じベンダー(rvid)であるかどうかを確認します。

希望は意味があります。私の脳は

更新が...笑痛い - ここで使用して、テーブルのデータのすべてをある*

Array 
(
[0] => Array 
    (
     [id] => 7 
     [rvid] => 7 
     [ratedate] => 2016-05-01 
     [rating] => 2 
    ) 

[1] => Array 
    (
     [id] => 8 
     [rvid] => 5 
     [ratedate] => 2016-05-01 
     [rating] => 1 
    ) 

[2] => Array 
    (
     [id] => 6 
     [rvid] => 5 
     [ratedate] => 2016-05-01 
     [rating] => 0 
    ) 

[3] => Array 
    (
     [id] => 5 
     [rvid] => 5 
     [ratedate] => 2016-05-01 
     [rating] => 3 
    ) 

) 

答えて

2

は、ここであなたがこれを近づいて始めることができる一つの方法だ - 完全にSQLで:

  • ゲットベンダーの最終評価。 ORDER BY DESC、limit 1
  • ベンダの2番目の評価を取得します。 ORDER BY日付DESC、制限1、オフセット1

次に、最初の2つのテーブルをLEFT結合するクエリを作成します。そして、あなたはcolumn1のは< 3である場合」という表現を書くことができます

  • ベンダーID
  • 最後の評価
  • 最後から二番目の評価

へ:あなたは3つの列を持つデータセットを持っています列2 < 3の場合、この新しい列はtrueです。 "

これを比較的簡単に3列に拡張できます。

+0

おかげでアレックスは、私が感じるには、イムだけを見つめてここに座っそれは笑顔のスクリーン..それはおかげで... :) –

+0

あなたの机から立ち上がって、少なくとも10分間モニターを見ないでください。コーヒーを飲む、ストレッチする、コード関連の何もしない。それから明快さが来るでしょう。 –

+0

実際に私は外のところに行きました。その答えは私のところに来ました - その真実: –

1

ここでは、この謎を解くために何が起きたのですか?私はここでそれを説明することは、アレックスも彼が日付を使用して私の脳の鍵を握ったように助けたように助けたと思う。私は最初にクエリの内側にstatmentを使用して見て始めましたが、実際にはそれが私の脳をボックスから取り出してから、何をするかがわかってきました。

これは完璧ではないし、コードを減らすためにいくつかのトリミングを使用することもできますが、私はそれを理解しているように思えます。私ベンダー(rvid)5が追加プラスである、一緒にグループ化されてどのようにこの

Array 
(
[0] => Array 
    (
     [rvid] => 7 
     [ratedate] => 2016-05-01 
     [rating] => 2 
    ) 

[1] => Array 
    (
     [rvid] => 5 
     [ratedate] => 2016-05-01 
     [rating] => 1 
    ) 

[2] => Array 
    (
     [rvid] => 5 
     [ratedate] => 2016-05-01 
     [rating] => 0 
    ) 

[3] => Array 
    (
     [rvid] => 5 
     [ratedate] => 2016-05-01 
     [rating] => 3 
    ) 

) 

通知する

クエリ...

$sql = "SELECT `rvid`, `ratedate`,`rating` FROM `vendor_ratings_archive` WHERE `rating` <= '3' ORDER BY `ratedate`, `rvid` DESC"; 

。次

私にこの

アレイ ( [0] => 7 [1] => 5 [2]を与える新しいアレイ

 foreach($results as $yield) 
    { 

     $rvidarray[] = $yield['rvid'];   

     }//close foreach 

をロードするための簡単なforeachの=> 5 [3] => 5 )

次に、配列値をグループ化してdupsをグループ化します

この

Array(
[7] => 1 
[5] => 3 
) 

になり

$rvidcounter = array_count_values($rvidarray); 

は今7 1などの低スコアをベンダーとベンダー5は3つの低いスコアを持っており、彼らはすでに日付でソートされたので、私はその連続していることを知っています。まあそれは

はその後、私たちは私に、これはすべてのサービス機能で行われたこの

Array 
(
[0] => 5 
) 

を与える別のforeach

 foreach($rvidcounter as $key => $value) 
    {  
     //anything 3 or over is your watchlist 

     if($value > 2) 
     { 
      $watchlist[] = $key; //rvid number stored 
     }  

     }//close foreach 

で最終的な配列を作成)」笑とにかくいいですね。だから、最終的な取引は、この配列の全員が3回連続して低い評価をしています。そして、私は通常のPHPプロセスファイルに返された配列を返し、idによって各ベンダーの名前をつかみ、htmlに渡してリストを出力します。

完了...

気に入った場合は、気軽に改善してください。上記のコードが意味をなさないので、私はそれを使うかもしれません。もっと複雑なことが私には意味をなさないかもしれません。笑今から6MOSですが、プロセスを少し短縮するために誰かがやってくるのを見ても面白いでしょう。

ありがとうございました。ハッピーコーディング!!!!!
デイブ:)あなたはそのようなSQLでそれを行うことができ

0

SET @rvid = -1; 

SELECT DISTINCT rvid FROM 
(
    SELECT 
    rvid, 

    @neg := rating<3, /* 0 or 1 for addition in next line */ 
    @count := IF(@rvid <> rvid , @neg, @[email protected]) AS `count`, /* set or add */ 
    @rvid := rvid  /* remember last row */ 
    FROM 
    testdb.venrate 

    ORDER BY 
    rvid, datetime desc 

) subq 

WHERE count>=3 
; 

あなたは非既存のIDに変数を設定します。時間順にソートされた各行では、評価が低すぎるかどうかをチェックし、結果が1(低すぎる)または0(大丈夫)になります。 rvidが最後のrvidと等しくなければ、新しいベンダーセクションが開始されていることを意味します。セクションの始めに値0または1を設定し、そうでない場合はこの値を追加します。最後に、次の行プロセスで比較のために現在の行のrvidを保存します。

上記のコードは、すべての時間をかけて(ロー3より小さい値を意味する)3件の連続低評価を探しています。

すべて最新3件の評価等しいまたは3未満されている場合には、小さな変更をチェックします。私は、プログラマーがブロックしているよう

SET @rvid = -1; 

SELECT DISTINCT 
    rvid 
FROM 
(
    SELECT 
    rvid, 

    @high_found := rating>3 OR (@rvid = rvid AND @high_found) unflag, 
    @count := IF(@rvid <> rvid , 1, @count+1) AS `count`, 
    @rvid := rvid  /* remember last row */ 

    FROM 
    testdb.venrate 

    ORDER BY 
    rvid, datetime desc 

) subq 

WHERE count=3 AND NOT unflag 
; 
+0

うわー!そこにコーディングの印象的なビットQ ...私の頭の上に方法が非常にクールでとても単純な笑:) –

+0

私は簡単な説明を追加しました。 –

+0

ありがとうございましたQ: –

関連する問題