5

我很难弄清楚这个...

我有两张桌子……ticket_winners 和门票

ticket_winners表中,用户名/个人资料信息...

票证表是这些用户针对一个用户 ID 拥有的所有票证,此表中每个用户可能有 10 多张票证。

问题:当每个用户的表门票超过 1 行时,如何循环数据的第二次迭代

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。

这将为您提供一个由多个用户组成的数组,在一个 while 循环中对它们进行排序并不困难,因为您只需使用用户 ID 的键创建一个获胜者数组,在该数组中附加中奖彩票 ID。

$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) 运行两个单独的查询和 b) 避免在 while 循环内创建不必要的 while 循环以加快此过程的需要。

执行此操作时要遵循的一个好习惯是:

  1. 在一次查询中获取尽可能多的数据。
  2. 循环一次并将数据排序到一个或多个数组中,消除因连接而导致的重复。
于 2012-04-08T23:50:42.440 回答
0

如我所见,您的数据已应用于 $result 数组-tickets-data 和tickets_winner-data。那你的问题是什么?也许我完全误解了它。

于 2012-04-08T22:07:28.680 回答