0

この質問をもう一度するように提案されましたが、より深く掘り下げました。

これが私のスクリプトです:

    <?php
    //Loggedin
    if($_SESSION['login']!=1)
    {
        print "You must be logged in.";
        include($root . 'footer.php');
        exit;
    }
    //Check banned account
    elseif($ui['level']=="2"){
        print "Sorry but your account is banned.";
        include($root . 'footer.php');
        exit;
    }
    //Check email verified
    elseif($ui['email_check']=="0"){
        print "Sorry but your account has not been verified, to verify your account now please visit <a href='index.php?index=verify&email=".$ui['email']."'>THIS LINK</a>.";
        include($root . 'footer.php');
        exit;
    }
date_default_timezone_set('America/New_York');
$country= $ui['country'];
$dates=mysql_query("SELECT * FROM `contest` WHERE `countries` LIKE '%$country%'");
$timestamp = time();

    $getcontests = $os_DB->query("SELECT * FROM contest WHERE date_1 <= '$timestamp' AND date_2 >= '$timestamp' AND countries LIKE '%$country%'");
        $num = $os_DB->num($getcontests);

            if($num == 0){
            print"<td colspan='4'>There are currently no active contests</td>";
            }
            else
            {

    while ($dat = mysql_fetch_array($dates)) {
        $tname = preg_replace('/\s+/', '', $dat['name']);
        $places="(SELECT * FROM `".$tname."_contest` WHERE `username` <> 'cassa' ORDER BY `completed` DESC LIMIT ".$dat['rewards'].")";
        $results=mysql_query($places) or die(mysql_error());




        $reward = array("".$dat['reward_1'].",".$dat['reward_2'].",".$dat['reward_3'].",".$dat['reward_4'].",".$dat['reward_5'].",".$dat['reward_6'].",".$dat['reward_7'].",".$dat['reward_8'].",".$dat['reward_9'].",".$dat['reward_10']."");

        $rewards = implode(",", $reward);

        $rewardsa = explode(",", $rewards);
        $i=0;
        $a=1;

            // Offers Contest

        if(time() <= $dat['date_2'] && time() >= $dat['date_1'] && $dat['type'] == offer) {
            print" <table width ='100%'><tr><th align='center'><font size='4'>{$dat['name']}</font></th><th align='right'><font size='1'>".date("m/d/Y h:i A", $dat['date_1'])."-".date("m/d/Y h:i A", $dat['date_2'])."</font></th></tr></table><br />".$dat['desc']."<br /><font size='1' color='white'>You must complete offers worth at least ".$dat['min_points']." points or $".$dat['min_cash']." to count towards contest!<br /><br />
            You must also complete at least ".$dat['min_offers']." offers in order to be eligible for winnings.</font><br /><br />";
            print" <table width ='100%'><tr><th align='left'>Place</th><th align='center'>User</th><th align='right'>Prize</th><th align='right'>Completed</th></tr>";

        if(mysql_num_rows($results) == 0){
            foreach($rewardsa as $rewa){
                if(!empty($rewa['$i'])){
                    if($dat['r_type'] == points){
                        print"  <tr><td align='left'>{$a}</td><td align='center'>......</td><td align='right'>{$rewardsa[$i]} points</td><td align='right'>--</td></tr>";
                    }
                if($dat['r_type'] == cash){
                    print"  <tr><td align='left'>{$a}</td><td align='center'>......</td><td align='right'>$".$rewardsa[$i]."</td><td align='right'>--</td></tr>";
                }
            $i++;
            $a++;
                }
            }
        }


    while ($place = mysql_fetch_array($results)) {
        if($dat['r_type'] == points){
            print"  <tr><td align='left'>{$a}</td><td align='center'>{$place['username']}</td><td align='right'>{$rewardsa[$i]} points</td><td align='right'>{$place['completed']}</td></tr>";
        }
        if($dat['r_type'] == cash){
            print"  <tr><td align='left'>{$a}</td><td align='center'>{$place['username']}</td><td align='right'>$".$rewardsa[$i]."</td><td align='right'>{$place['completed']}</td></tr>";
        }
        $i++;
        $a++;

    }
    ///Line I am working with///
    $getyou= mysql_query("SELECT COUNT(*) AS Place, t.*
    FROM ".$tname."_contest t
    GROUP BY t.id
    HAVING Place <= 3 OR username = '".$ui['username']."'");
        $youu = mysql_fetch_array($getyou);
        print"  <tr><td align='left'>{$youu['Place']}</td><td align='center'>You</td><td align='right'>---</td><td align='right'>{$youu['completed']}</td></tr>";
        }
    }
        }

?>  
        </table>

このスクリプトを使用して、ログインしているユーザーに、現在の勝者の下で現在コンテストに参加している場所を表示できるようにしたいと考えています。

これが私がテーブルをどのように見せたいかです。

-----------------------------------------
| Place |    User   | Prize | Completed |
|   1   | Someuser1 | $5.00 |     5     |
|   2   | Someuser2 | $2.50 |     3     |
|   3   | Someuser3 | $1.25 |     2     |
|   20  |    You    |  ---  |     1     |
-----------------------------------------

見た目はこんな感じ

-----------------------------------------
| Place |    User   | Prize | Completed |
|   1   | Someuser1 | $5.00 |     5     |
|   2   | Someuser2 | $2.50 |     3     |
|   3   | Someuser3 | $1.25 |     2     |
|   1   |    You    |  ---  |     1     |
-----------------------------------------

これが私のテーブル構造です。

    Column   |  Type | Null |  Default
--------------------------------------
    id       |int(11)|  No  |   
    username |text   |  No  |   
    completed|int(11)|  No  |   

ご覧のとおり、すべて 1 つのテーブルから取得されており、場所はデータベースではなく、スクリプト自体によって定義されています。

うまくいけば、これは私の最後の質問よりも多くを明確にすることができます.

編集:Sean のコードを使用すると、これが得られます。

-----------------------------------------
| Place |    User    | Prize | Completed |
|   1   |   kikkat   | $5.00 |     1     |
|   2   |xXchris744Xx| $2.50 |     1     |
|   3   |  kira423   | $1.25 |     1     | /// This line is me
|   7   |    You     |  ---  |     1     | /// But it shows my current place as 7
-----------------------------------------
4

1 に答える 1

1

これは、ネストされたクエリで実行できます-

$getyou= mysql_query("SELECT 
                        (SELECT count(*)+1 AS rank FROM contest WHERE completed >
                          (SELECT completed FROM contest WHERE username = '".$ui['username']."' ORDER BY completed DESC LIMIT 1)) as Place,
                        c.* FROM contest c WHERE username = '".$ui['username']."'");
$youu = mysql_fetch_array($getyou);
    print"  <tr><td align='left'>{$youu['Place']}</td><td align='center'>You</td><td align='right'>---</td><td align='right'>{$youu['completed']}</td></tr>";

クエリが内部からどのように機能するかを次に示します。

1 番目 (内部)SELECTcompletedusername =$ui['username']

SELECT completed FROM contest WHERE username = '".$ui['username']."' ORDER BY completed DESC LIMIT 1

2 番目 (中央)SELECTはそのcompleted量を使用しcount、さらに完了したすべての行の a を実行し、それに a1を追加しcount、それを users として保存しますPlace

SELECT count(*)+1 AS rank FROM contest WHERE completed > '#' // # represents the `completed` amount for the `$ui['username']` that we got in the 1st SELECT

3番目/最後(外側)SELECTは、行データを取得するだけですusername =$ui['username']

SELECT Place, c.* FROM contest c WHERE username = '".$ui['username']."'  // Place was created/defined in early SELECTS, now we just get the rest of the data using c.*

編集

tiebreakerwhen one or more has the same numberを追加するにはcompleted、クエリも で並べ替える必要がありますid。最初のクエリを次のように変更します -

$places="(SELECT * FROM `".$tname."_contest` WHERE `username` <> 'cassa' ORDER BY `completed`,`id` DESC LIMIT ".$dat['rewards'].")";
                                                                                              ---

そして、2番目のクエリにORDER BY idandを追加します>=

$getyou= mysql_query("SELECT 
                        (SELECT count(*)+1 AS rank FROM contest WHERE completed >=
                                                                                --
                          (SELECT completed FROM contest WHERE username = '".$ui['username']."' ORDER BY completed DESC LIMIT 1) ORDER BY `completed`,`id`) as Place,
                                                                                                                                 -------------------------
                        c.* FROM contest c WHERE username = '".$ui['username']."'");

編集 #2 この新しいクエリを試してください。前のものは正確な行を選択していませんでしたが、tied.

$getyou= mysql_query("SELECT Place, c.* FROM
                      (SELECT @Place:=@Place+1 AS Place, c.*
                        FROM contest c, (SELECT @Place := 0) r ORDER BY completed DESC, id ASC ) c
                         WHERE username = '".$ui['username']."'");

この新しいクエリは、 を使用して一時的な新しい列を作成しPlace、 を使用しSELECT @Place := 0てユーザーの「場所」を取得します@Place:=@Place+1 AS Place

于 2012-11-25T04:50:35.823 に答える