0

我有一个包含多个数据的数据库,但它们当然是独一无二的。这些数据位于每个表中,telcoCalltelcoDatatelcoSMS,具体取决于其类。

然后我使用json_encode将这些数据合并到 1 个单个数组中。在telcoCall内部,数据位于适当的位置。但是,telcoDatatelcoSMS很混乱。这些表中的数据正在被复制。看起来是这样的

在此处输入图像描述

这是代码:

<?PHP
include '../initialization.php';

$mysqli = @mysqli_connect($host, $username, $password, $db);

$query = 'SELECT t.*, c.*, d.*, s.* '.
         'FROM telco t '.
            'INNER JOIN telcoCall c ON t.telcoId = c.telcoId '.
            'INNER JOIN telcoData d ON t.telcoId = d.telcoId '.
            'INNER JOIN telcoSMS s ON t.telcoId = s.telcoId '.
                'ORDER BY t.telcoName, c.callName, d.dataName, s.smsName';

//setup array to hold information
$telcos = array();

//setup holders for the different types so that we can filter out the data
$telcoId = 0;
$callId = 0;
$dataId = 0;
$smsId = 0;

//setup to hold our current index
$telcoIndex = -1;
$callIndex = -1;
$dataIndex = -1;
$smsIndex = -1;

if ($result = mysqli_query($mysqli, $query)) {
    //go through the rows
    while($row = mysqli_fetch_assoc($result)) {
        if($telcoId != $row['telcoId']) {
            $telcoIndex++;
            $callIndex = -1;
            $dataIndex = -1;
            $smsIndex = -1;
            $telcoId = $row['telcoId'];

            //add the console
            $telcos[$telcoIndex]['Telco'] = $row['telcoName'];

            //setup the information array
            $telcos[$telcoIndex]['Call Promo'] = array();
            $telcos[$telcoIndex]['Data Promo'] = array();
            $telcos[$telcoIndex]['SMS Promo'] = array();
        }

        if($callId != $row['callId']) {
            $callIndex++;
            $callId = $row['callId'];

            //add the model to the console
            $telcos[$telcoIndex]['Call Promo'][$callIndex]['Call Name'] = $row['callName'];

            //setup the title array
            $telcos[$telcoIndex]['Call Promo'][$callIndex]['Call'] = array();

            //add the game to the current console and model
            $telcos[$telcoIndex]['Call Promo'][$callIndex]['Call'][] = array(
                'Keyword'     => $row['callKeyword'],
                'Description' => $row['callDescription'],
                'Number'      => $row['callNumber'],
                'Validity'    => $row['callValidity'],
                'Price'       => $row['callPrice']
                );
        }

        if($dataId != $row['dataId']) {
            $dataIndex++;
            $dataId = $row['dataId'];

            //add the model to the console
            $telcos[$telcoIndex]['Data Promo'][$dataIndex]['Data Name'] = $row['dataName'];

            //setup the title array
            $telcos[$telcoIndex]['Data Promo'][$dataIndex]['Data'] = array();

            //add the game to the current console and model
            $telcos[$telcoIndex]['Data Promo'][$dataIndex]['Data'][] = array(
                'Keyword'      => $row['dataKeyword'],
                'Description'  => $row['dataDescription'],
                'Number'       => $row['dataNumber'],
                'Validity'     => $row['dataValidity'],
                'Volume'       => $row['dataVolume'],
                'Price'        => $row['dataPrice']
            );
        }

        if($smsId != $row['smsId']) {
            $smsIndex++;
            $smsId = $row['smsId'];

            //add the model to the console
            $telcos[$telcoIndex]['SMS Promo'][$smsIndex]['SMS Name'] = $row['smsName'];

            //setup the title array
            $telcos[$telcoIndex]['SMS Promo'][$smsIndex]['SMS'] = array();

            //add the game to the current console and model
            $telcos[$telcoIndex]['SMS Promo'][$smsIndex]['SMS'][] = array(
                'Keyword'      => $row['smsKeyword'],
                'Description'  => $row['smsDescription'],
                'Number'       => $row['smsNumber'],
                'Validity'     => $row['smsValidity'],
                'Price'        => $row['smsPrice']
            );
        }
    }

    mysqli_free_result($result);
}

echo json_encode($telcos);

mysqli_close($mysqli);
?>

我真的不知道为什么会这样。

4

2 回答 2

1

是的,斯科特是对的,那个片段只是冰山一角,所以我完成了他的建议,消除多余的条目,留下独特的条目。 https://gist.github.com/jwara/fdc805240cf03027ae20 - 代码有点不干净,但需要优化

http://cl.ly/image/2I3v2O29341J/o

于 2013-03-12T18:04:18.260 回答
0

看起来 telcoId 在 telco 表中是唯一的,但在其他表中可以是多个(这是有道理的),不幸的是,如果您尝试将单个 (1) 连接到 multiple1 (2) 到 multiple2 (2) 到 multiple3 (3),它'd 创建 1 * 2 * 2 * 3 = 12 行,这解释了混乱的 multiple2 和 multiple3。

因此,通过运行单独的查询,首先获取电信公司信息,然后在 telcoCall、telcoData、telcoSMS 上为每个电信公司进行单独的 DB 调用,而不是进行单个数据库调用,您将看到效率降低。

或者,如果您只想要速度并且不关心干净的代码,您可以使用您现在拥有的,但堆叠 if 条件:

编辑1:编辑修复逻辑缺陷,出于某种原因,高斯消除浮现在脑海

// Stacking order determined by your SQL ORDER BY: t.telcoName, c.callName, d.dataName, s.smsName

if($telcoId == $row['telcoId']) continue;
//telco stuff...

if($callId == $row['callId']) continue;
//call stuff...

if($dataId == $row['dataId']) continue;
//data stuff...

if($smsId == $row['smsId']) continue;
//sms stuff...

编辑2:另一种需要较少脑力劳动的较慢方式

if($telcoId != $row['telcoId']) {
    //telco stuff...
    callArrayTemp = array();
    dataArrayTemp = array();
    smsArrayTemp = array();
}
if(!in_array($row['callId'], callArrayTemp[])) {
    callArrayTemp[] = $row['callId'];
    //call stuff...
}
if(!in_array($row['dataId'], dataArrayTemp[])) {
    dataArrayTemp[] = $row['dataId'];
    //data stuff...
}
if(!in_array($row['smsId'], smsArrayTemp[])) {
    smsArrayTemp[] = $row['smsId'];
    //sms stuff...
}
于 2013-03-12T05:15:19.887 回答