0

mysqlデータベースに列a、b、c、dがあります(簡単にするため)。

  • 列aはユーザーID#(一意ではない)です
  • 列bはファイルパスです
  • 列cは「グループID」です
  • 列dはアップロード日時です

同時にアップロードされるファイルには、各データベースエントリにそれぞれ同じ「グループID」が保存されます。

まず、次のクエリを実行します。
SELECT * FROM database WHERE a='$userid' ORDER BY d DESC

次に、ループ内のmysqli_fetch_assoc関数を使用しwhileて、データをリストにフィードします(上記のように、指定されたIDについて、アップロード日順に並べられています)。

私の問題は、同じフェッチされた出力で同じ「グループID」を持つものをグループ化する必要があることです。これはある種のサブクエリで可能ですか、それとも完全に不十分な状態でこれを実行していますか?よりうまく機能するPDOの代替案があれば、それも喜んで見ていきます。

編集:この質問をもう少し定義するには、以下のセットアップとしてコードを見つけてください:

したがって、同じグループIDを持つエントリは、同じ場所に配置する必要があります<li>

<body>
    <ul><?=$output?></ul>
</body>

$userid = $_SESSION['id'];
$output='';
$q = mysqli_query("SELECT * FROM database WHERE a='$userid' ORDER BY d DESC");

while($row=mysqli_fetch_assoc($q)){
    $output.=formatfxn($row['b'],$row['c'],$row['d']);
}

function formatfxn($filep,$groupid,$dt){
    if(is_string($dt)){
        $dt=strtotime($dt);
        if(is_file($filep) === true){
            $filel='<img class="postimg" src="'.$filep.'" />';
        }
    return '<li>'.$filel.'</li>';
    }
}
4

2 に答える 2

2

あなたの質問から、あなたが正確に何を望んでいるのかは明確ではありません。ただし、アップロード要素をグループIDごとに整理する必要があるようです。

申し訳ありませんが、a、b、c、dという名前の列を処理するつもりはありません。

あなたはこれを行うことができます:

   SELECT * 
     FROM datatable
    WHERE user_id='$userid'
 ORDER BY group_id DESC

これにより、グループIDの降順でアイテムが表示されます。実際に同じgroup_idを持つアイテムが同じupload_timeを持っていて、group_id値を順番に割り当てる場合、これはあなたにとって何か便利なことをします。

どういうわけか、group_id値ごとに1行だけを取得する必要がありますか?あなたはこれを試すことができます:

   SELECT user_id, 
          group_id, 
          MIN(upload_time) upload_time, 
          GROUP_CONCAT( filepath 
                        ORDER BY upload_time, filepath 
                       SEPARATOR ';') filepaths
     FROM datatable
    WHERE user_id=1
 GROUP BY user_id, group_id
 ORDER BY upload_time DESC

http://sqlfiddle.com/#!2/4f2df/1/0

これにより、セミコロンで区切られた1つのテキストフィールドにファイルパスが表示されます。行とファイル名は、各グループの最初のアイテムの更新時間順に並べられます。

于 2012-09-05T18:15:01.340 に答える
0

まず、タグはPDOであるため、適切な構文ではないPDOを使用している場合

私はそのようなことをします(私が正しく理解していれば、あなたは少し漠然としています)

$st= $db->prepare("SELECT * FROM database WHERE a=? ORDER BY d DESC");
$st->setFetchMode(PDO::FETCH_ASSOC);
$data=array($userid);
$st->execute($data);
while($something=$data->fetch()){

//handle $something as you want. 
}

idの配列unique(検索)のようなことを行うことをお勧めします。そうすれば、各idの連想配列を取得できます。

ここで私はあなたを助けるかもしれない何かをここで見つけました(私のコメントと並行して): 連想配列でユニークな配列-重複を削除する 受け入れられた答えはあなたの問題を解決します。(その男+1)

于 2012-09-05T18:35:18.613 に答える