2013-03-08 3 views
0

У меня есть база данных с несколькими данными в ней, но они уникальны, конечно. Эти данные находятся внутри каждой таблицы, telcoCall, telcoData, telcoSMS, в зависимости от его класса.Повторяющиеся данные JSON повторяются

Затем я использую json_encode, чтобы объединить эти данные в один массив. Внутри telcoCall данные находятся в надлежащем месте. Однако telcoData и telcoSMS беспорядочны. Данные внутри этих таблиц дублируются. Вот как это выглядит,

enter image description here

Вот код:

<?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); 
?> 

Я действительно не знаю, почему это происходит.

+0

Просьба представить примеры данных, предпочитаемых в виде 'CREATE TABLE ... и 'INSERT INTO ... VALUES ... 'sql statements – VolkerK

+0

Я отредактировал мое сообщение. – Jahm

+0

Thx, но с этим примером данных ваш запрос возвращает нулевые записи. – VolkerK

ответ

0

По-видимому, telcoId является основным уникальным в таблице telco, но может быть кратным в других таблицах (что имеет смысл), к сожалению, если вы попытаетесь объединить отдельные (1) и множественные (2) в multiple2 (2) в multiple3 (3), это создало бы 1 * 2 * 2 * 3 = 12 строк, что объясняет беспорядочные multiple2 и multiple3.

Таким образом, вместо того, чтобы делать этот единственный вызов БД, вы будете смотреть на меньшую эффективность, запустив отдельные запросы, сначала получив информацию о телекоммуникациях, а затем сделав индивидуальные вызовы БД для каждого telco на telcoCall, telcoData, telcoSMS.

Или если вы просто хотите, скорость и не заботятся о чистом коде, вы можете просто использовать то, что у вас есть прямо сейчас, но складывайте если условия:

EDIT 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... 

EDIT 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... 
} 
+0

Я попробовал ваше предложение, но есть только одна информация. – Jahm

+0

Вы правы, логический провал там, я починю его, представив массив. –