2016-10-12 11 views
1

SQLデータベースで2つのリクエストがあります。スクリプト/ページ全体をロードするのに実際には時間がかかります。より良い(速い)方法がありますか?私のコードは次のようになりますPHP SQL/multible selectリクエスト/ slow

$abfrage = "SELECT * FROM table_a WHERE state = '0' ORDER BY EDIT DESC"; 
     $stmt = $pdo->query($abfrage); 

     foreach($stmt as $data) { ?> 

$usern = $data['user_name']; 
$stmt = $pdo->query("SELECT * FROM tabl_b WHERE user_name = '$usern' ORDER BY follower DESC Limit 1"); 
$stmt->execute(); 
$pl = $stmt->fetch(); 

<?php echo $data['ID'];?> 
     <?php echo $data['ID'];?> 

     <?php if ($data['company'] == '') { ?> 
     <a href="https://open.spotify.com/user/<?php echo $data['user_name'];?>" target="_blank"><?php if ($data['state'] == '3') { echo "<span style=\"color:#0000FF\";>".$data['user_name']."</span>"; } else { echo $data['user_name'];}?></a> 
     <?php } else {?> 

     <a href="https://open.spotify.com/user/<?php echo $data['user_name'];?>" target="_blank"><?php if ($data['state'] == '3') { echo "<span style=\"color:#0000FF\";>".$data['company']."</span>"; } else { echo $data['company'];}?></a> 

     <?php } ?> 

     <?php echo $data['PL_read'];?> 
     <?php echo $data['PL_total'];?> 
     <?php echo $data['country'];?> 
     <?php echo $data['EDIT'];?> 
    <?php echo $pl['follower'];?> 
     <?php } ?> 

私はエコーデータの周りにテーブルを持っています。誰かが私にチップを与えることができるなら、私は素晴らしいだろう。

+0

あまりにも多くのオブジェクトがあなたのテーブルに存在している?私はPHPに本当にないんだけどコードの下、この使用を避けるために、また、時間がかかりますループ内で実行されている、しかし、私はこの問題を抱えていましたこの種のことをスピードアップする唯一の方法は、それらを改ページすることです。 –

答えて

2

最初にテーブルにリレーションがある場合は、ジョインで1回の呼び出しでデータを取得することをお勧めします。状態、USER_NAME

ALTER TABLE `table_a` ADD INDEX `state` (`state`) 
ALTER TABLE `tabl_b` ADD INDEX `user_name` (`user_name`) 
+0

これははるかに高速です。テーブルにINDEXを追加するとどうなりますか? – LJSven

+0

はい、INDEXがない場合は、テーブルのデータ全体に対して検索が実行されます。 INDEXをお持ちの場合は、必要なフィールドにのみ検索が行われます。http://dev.mysql.com/doc/refman/5.7/en/mysql-indexes.html – codtex

0
  1. それはロード時間のために来て、その後 - あなたはWHERE句で使用されている2つのフィールドにインデックスを置くことができ、物事をスピードアップするための

    SELECT * FROM table_a a 
    LEFT JOIN tabl_b b ON a.user_name = b.user_name 
    WHERE a.state = '0' 
    

    セカンド私たちは必要なテーブルからそれらの列を取り出す必要があります。したがって、最初のクエリでは、ユーザー名、ID、会社、PL_read、PL_total、国、EDITを取得できます

  2. クエリこれはとても

    $dataArray = array(); 
        $userName = NULL; 
        $abfrage = "SELECT ID, user_name, company, PL_read, PL_total, country, EDIT FROM table_a WHERE state = '0' ORDER BY EDIT DESC"; 
        $stmt = $pdo->query($abfrage); 
    
        foreach($stmt as $data) { 
         //creating a string 
         if (is_null($userName)) 
         { 
          $userName = "'" . $data['user_name'] . "'"; 
         } 
         else 
         { 
          $userName .= ",'" . $data['user_name'] . "'"; 
         } 
         $dataArray[$userName] = $data; 
        } 
    
        $stmt = $pdo->query("SELECT follower, user_name FROM tabl_b WHERE  user_name IN ($userName) ORDER BY follower"); 
    
        foreach($stmt as $data) { 
         if(isset($dataArray[$userName])) 
         { 
          $dataArray[$userName]['follower'] = $data['follower']; 
         } 
         else 
         { 
          $dataArray[$userName]['follower'] = 'N/A'; 
         } 
        } 
    
        foreach($dataArray as $data) { 
          echo $data['ID'];?> 
          <?php echo $data['ID'];?> 
    
          <?php if ($data['company'] == '') { ?> 
           <a href="https://open.spotify.com/user/<?php echo $data['user_name'];?>" target="_blank"><?php if ($data['state'] == '3') { echo "<span style=\"color:#0000FF\";>".$data['user_name']."</span>"; } else { echo $data['user_name'];}?></a> 
          <?php } else {?> 
           <a href="https://open.spotify.com/user/<?php echo $data['user_name'];?>" target="_blank"><?php if ($data['state'] == '3') { echo "<span style=\"color:#0000FF\";>".$data['company']."</span>"; } else { echo $data['company'];}?></a> 
    
          <?php } ?> 
    
          <?php echo $data['PL_read'];?> 
          <?php echo $data['PL_total'];?> 
          <?php echo $data['country'];?> 
          <?php echo $data['EDIT'];?> 
          <?php echo $pl['follower'];?> 
    <?php } ?>