使用PHP / MySQL构建更多维的JSON对象

时间:2014-03-02 10:24:05

标签: php mysql json

所以,首先 - 我的目标是构建一个SQL查询,它会吐出以下JSON对象。正如您所看到的,它会吐出一些基本的竞争细节,然后是每个与该竞争相关的用户。此外,它还为每个用户显示他们已执行的活动。

{
        organisationId: 1,
        competitionId: "52eabcf0f3672",
        title: "Sales Hood Q1 Challenge",
        end_date: "2014-03-01 00:00:00",
        description: "This is it guys, challenge time!",
        prizeImage: "placeholder.jpg",
        prizeDescription: "Dinner for 2!",
        users: [{
            id: 2,
            name: "Jane Wilson",
            isAdmin: true,
            direction: "down",
            profilePic: "fighter-1.jpg",
            tagline: "My shit is consistently on fire",
            totalPoints: 40,
            isOnStreak: false,
            activities: [{ 
                id: 6431,
                time: (57).minutes().ago(),
                points: 20
            }, {
                id: 6431,
                time: new Date(),
                points: 20
            }]
        }, {
            id: 3,
            name: "Caroline Wilson",
            isAdmin: false,
            direction: "up",
            profilePic: "fighter-3.jpg",
            tagline: "I am the best",
            totalPoints: 60,
            isOnStreak: false,
            activities: [{ 
                id: 6431,
                time: (1).days().ago,
                points: 20
            }, {
                id: 6431,
                time: (2).days().ago,
                points: 20
            }, {
                id: 6431,
                time: new Date(),
                points: 20
            }]
        }, {
            id: 1,
            name: "Matthew Lloyd",
            isAdmin: false,
            direction: "down",
            profilePic: "placeholder.jpg",
            tagline: "Aref to the rescue!",
            totalPoints: 140,
            isOnStreak: false,
            activities: [{ 
                id: 6431,
                time: new Date(),
                points: 20
            }, {
                id: 6431,
                time: new Date(),
                points: 20
            }, {
                id: 6432,
                time: new Date(),
                points: 100
            }]
        }]
    };

我有以下SQL架构(在这个小提琴http://sqlfiddle.com/#!2/82d6e/1处可用),我似乎无法构建一个能够提供我想要的查询。

为了澄清,在数据库中有以下表格

  1. 比赛
  2. 用户
  3. competitionmembers - >这是受邀参加比赛的用户
  4. activity_types - >与该竞赛相关的活动
  5. activity_entries - >用户实际“执行”的活动
  6. 就SQL / PHP查询而言,这是我到目前为止所处的位置 - 但似乎无法做到正确。

     $get = mysql_query("SELECT c.organisationId, c.competitionId, c.name, c.end_date, c.about, c.prizeImage, c.prize, u.name AS userName, u.id AS userId, u.profilePic, u.tagline
    FROM competitions c
    INNER JOIN users1 u ON c.organisationId = u.organisationId 
    INNER JOIN competitionmembers m ON m.userid = u.id
    WHERE c.competitionId = '52a99783c5d6f'") or die("Couldn't select competition details");
    
    
    $arr = array();
    
    while ($row = mysql_fetch_array($get)) {
    
        $arr = array(
            array(
                "competitionId" => $row["competitionId"],
                "title" => $row["name"],
            ),
            array(
                "id" => $row["userId"],
                "name" => $row["userName"],
            )
        );
    }
    
    echo json_encode($arr);
    
    ?>
    

    如果您能够更接近那个非常棒的json对象,我会非常喜欢这方面的帮助!

1 个答案:

答案 0 :(得分:0)

您应该提出更多疑问:

  • Query1 =首先获得竞争数据
  • Query2 =获取与竞争相关的所有用户
  • Query3 =获取与用户相关的活动(收集用户密钥)

我很确定这会更快更容易管理。如果您只尝试使用一个查询,则会有很多重复的数据,查询会变得非常慢。

获得数据后,请将其保留在数组中,并使用in_arrayarray_key_exists等函数将所有数据放在一起。

PSEUDO CODE:

$competition = query1;

$users = query(get users in competition);

$competition["users"] = $users;

$user_ids = array();

foreach($users as $user)
  $user_ids[] = $user['id'];

$activities = query("select * from activities where id_user in (" . implode(",", $user_ids)) . ")";

for ($i = 0; $i < count($competition["users"]); $i++) {

  $competition["users"][$i]["activities"] = array(); 

  foreach($activities as $act) {

    if ($competition["users"][$i]['id'] == $act["id_user"]) {

       // Add activity..
       $competition["users"][$i]["activities"][] = $act;

    }
  }
}

echo json_encode($competition);