Php 如何将两个mysql表组织成一个大的多维数组?

Php 如何将两个mysql表组织成一个大的多维数组?,php,mysql,arrays,Php,Mysql,Arrays,我很难弄明白这件事 我有两张桌子。。。优胜者,还有票 在票证优胜者表中,用户名/配置文件信息 tickets表是这些用户对一个用户ID拥有的所有tickets,该表中每个用户可能有10多张tickets 问题:当表票证对每个用户有超过1行时,如何循环第二次迭代数据 function pullTickets() { $sql = $this->mysql->retrieve("SELECT * FROM ticket_winners ORDER BY id DESC LIMIT

我很难弄明白这件事

我有两张桌子。。。优胜者,还有票

票证优胜者表中,用户名/配置文件信息

tickets表是这些用户对一个用户ID拥有的所有tickets,该表中每个用户可能有10多张tickets

问题:当表票证对每个用户有超过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
    )

tickets表没有像[1]数组中那样在每个用户之间循环。它跳过所有其他用户的票证。

我看到,您的数据应用于$result数组-票证数据和票证数据。那么你的问题是什么?可能我完全误解了。

尝试在ticket\u 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
左连接保留您的ticketwinners表的表格式,并将附加t.id(在输出中作为tick_id)、ticketId和userName

这将为您提供一个由多个用户组成的数组,在一个while循环中对它们进行排序并不困难,因为您只需使用usersid键创建一个winners数组,并在该数组中附加中奖票证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循环,从而加快此过程

执行此操作时要遵循的良好实践是:

  • 在一个查询中获取尽可能多的数据
  • 循环一次并将数据排序到一个或多个数组中,从而消除因连接而产生的重复

  • sql连接似乎是个好的开始……是的,我试过了。当我使用连接输出数据时,会显示重复的行,因为tickets表有多个条目用于同一个用户。是的,这是正确的。如果查看数组示例,请参见数组[2],该用户的票证不会循环到中。它在[1]数组处停止,只显示每个用户中有10+张票的1张票。谢谢你,伙计!我做了所有的事情,而且很有效。非常有用的评论。。。我也将遵循这些做法:DNo问题:)很高兴这有帮助。(你介意接受这个答案吗?)