5

これが分からなくて困ってます…

私は2つのテーブルを持っています... ticket_winnersとチケット

ticket_winnersテーブルでは、ユーザー名 / プロフィール情報...

チケットテーブルは、これらのユーザーが 1 つのユーザー ID に対して持っているすべてのチケットです。このテーブルには、ユーザーごとに 10 以上のチケットが存在する可能性があります。

質問:テーブルチケットにユーザーごとに複数の行がある場合、データの 2 回目の繰り返しをループするにはどうすればよいですか?

function pullTickets() {
    $sql = $this->mysql->retrieve("SELECT * FROM ticket_winners ORDER BY id DESC LIMIT 5");
    $sql2 = $this->mysql->retrieve("SELECT id, userId, ticketId FROM tickets ORDER BY id ASC LIMIT 5");
    while($row = mysql_fetch_array($sql)) {
        $results[$row['id']]['user'] = $row['userId'];

        while($row2 = mysql_fetch_array($sql2)) {
            if($results[$row['id']]['user'] == $row2['userId']) {
                $results[$row['id']]['tickets'][$row2['id']] = $row2['ticketId'];
            } else {
            }
        }

    }
    return $results;
}

PHP ページの例: 正常に動作します

$data = $obj->pullTickets();
foreach($data as $user) {
   echo $user['username'];
   foreach($data['ticket'] as $ticket) {
       echo $ticket['ticketId'];
   }
}

アレイは次のようになります。

[1] => Array
    (
        [batch] => 1
        [userId] => 200
        [userName] => Craig
        [tickets] => Array
            (
                [1] => GH7JNm72hN
                [2] => JudM3rT3is
                [3] => KiLPoXCmDF
            )

    )
[2] => Array
    (
        [batch] => 1
        [userId] => 100
        [userName] => Hewbie
        needs to continue looping
    )

[1] 配列のように、チケット テーブルは各ユーザーをループしていません。他のすべてのユーザーのチケットをスキップします。

4

2 に答える 2

3

ticket_winnersテーブルで左結合を試してください。SELECT*は使用しないでください。使用することはお勧めできません。結合を使用する場合は、各列にテーブル名を追加する必要があります。

SELECT tw.id,tw.userid,t,userName,t.id AS tick_id, t.ticketId 
    FROM `ticket_winners` AS tw
LEFT JOIN `tickets` AS t
    ON tw.userid = t.userid 
ORDER BY tw.id DESC LIMIT 5

左結合は、チケット勝者テーブルのテーブル形式を保持し、t.id(tick_idとして出力に)、ticketId、およびuserNameを追加します。

これにより、複数のユーザーで構成される配列が得られ、usersidのキーを使用してwinners配列を作成し、その配列内に勝者チケットIDを追加するだけなので、1つのwhileループでそれらを並べ替えることは難しくありません。

$results = array();

while ($sql = mysql_fetch_array($query, MYSQL_ASSOC) {
    $results[$sql['userid']]['userName'] = $sql['user'];
    $results[$sql['userid']]['tickets'][] = $sql['tick_id'];
}

結果の配列:

[1] => array 
    (
    ['userName'] => 'Craig',
    ['tickets'] => array 
        (
        [0] => 'GH7JNm72hN',
        [1] => 'JudM3rT3is'
        )
    )
[2] => array 
    (
    ['userName'] => 'Adam',
    ['tickets'] => array 
        (
        [0] => 'GfdT24sDgC'
        )
    )

これにより、a)2つの別々のクエリを実行する必要がなくなり、b)whileループ内に不必要なwhileループを作成して、このプロセスを高速化する必要がなくなります。

これを行うときに従うべき良い習慣は次のとおりです。

  1. 1つのクエリでできるだけ多くのデータを取得します。
  2. 一度ループして、データを1つまたは複数の配列に並べ替え、結合による重複を排除します。
于 2012-04-08T23:50:42.440 に答える
0

ご覧のとおり、データは $result 配列に適用されます - チケットデータとチケット勝者データの両方です。では、あなたの質問は何ですか?たぶん私はそれを完全に誤解しています。

于 2012-04-08T22:07:28.680 に答える