2014-09-10 3 views
0

Я пытаюсь найти способ показать мои отношения с сущностью лучше. Моя БД состоит из 3 таблиц: членов, сборов и сборов_has_members.PHP MySQL несколько запросов в один

Один член может иметь несколько комиссий и наоборот. Проблема в том, что когда я хочу отображать всех участников и их соответствующие сборы, мой цикл while проходит через все сущности и отображает всю информацию каждый раз, когда он зацикливается.

Цикл отображает это следующим образом:

Member A 
Fee B 
200 $ 

Member A 
Fee C 
230 $ 

Member A 
Fee B 
200 $ 

Я еще раз хочу отобразить член и все связанные с ним сборы.

Код:

<?php 
mysql_connect("#######", "########", "######") or die(mysql_error()); 
mysql_select_db("#####") or die(mysql_error()); 
?> 

<h3>Members:</h3> 
<?php 
$result = mysql_query("SELECT boder_boder_id, medlemmer_medlemmer_id, medlemmer_navn, medlemmer_id, boder_navn, boder_id, boder_pris FROM boder_has_medlemmer, medlemmer, boder WHERE boder_boder_id = boder_id AND medlemmer_medlemmer_id = medlemmer_id"); 
?> 

<?php 
if (mysql_num_rows($result) == 0) 
echo "Query returned 0 rows"; 
?> 

<?php 
$samlet = 0; 
while($row = mysql_fetch_array($result)) 
{ ?> 

<p> 
<?php 
    echo $row[medlemmer_navn].'<br>'; 
    echo $row[boder_navn].'<br>'; 
    echo $row[boder_pris].' kr.'; 
    $samlet += $row[boder_pris]; 
?> 
</p> 

Я знаю, что я мог бы изменить запрос MySQL, чтобы включить конкретное имя элемента, но тогда я должен был бы работать 30 запросов для отображения всех членов и их сборов.

Надеюсь, я ясно дал понять.

Любые предложения?

ответ

1

Ваша идея с запросом на одного члена глупо: D

Попробуйте это.

<?php 
mysql_connect('#######', '########', '#######') or die(mysql_error()); 
mysql_select_db('#####') or die(mysql_error()); 

echo '<h3>Members:</h3>'; 

$result = mysql_query('SELECT `boder_boder_id`, `medlemmer_medlemmer_id`, `medlemmer_navn`, `medlemmer_id`, `boder_navn`, `boder_id`, `boder_pris` FROM `boder_has_medlemmer`, `medlemmer`, `boder` WHERE `boder_boder_id` = `boder_id` AND `medlemmer_medlemmer_id` = `medlemmer_id`;'); 

if (!mysql_num_rows($result)) 
{ 
    echo 'Query returned 0 rows'; 
} 

$samlet = 0; 
$medlemmers = array(); 
while($row = mysql_fetch_array($result)) 
{ 
    $medlemmers[$row['medlemmer_navn']][] = $row; 
} 

foreach($medlemmers as $navn => $medlemmer) 
{ 
    echo '<p>'; 
    echo $navn . '<br />'; 
    foreach($medlemmer as $row) 
    { 
     echo $row['boder_navn'] . '<br />'; 
     echo $row['boder_pris'] . ' kr.'; 
     $samlet += $row['boder_pris']; 
    } 
    echo '</p>'; 
} 

Это не проверял, но должен идти в правильном направлении ^^

+0

Да, я знаю, что идея глупа, как я уже указывал :) Я немедленно испытаю ваше предложение. –

+1

Отлично работает! Thx m8 :) –

1

Немного другой альтернативы использования объекта. Это позволит сэкономить память по сравнению с чтением всех данных в массив.

Каждый раз, когда имя изменяется объект задается (запуск функции __destruct для вывода деталь) и новый объект, созданного

<?php 
mysql_connect("#######", "########", "######") or die(mysql_error()); 
mysql_select_db("#####") or die(mysql_error()); 

echo "<h3>Members:</h3>"; 

$result = mysql_query("SELECT boder_boder_id, medlemmer_medlemmer_id, medlemmer_navn, medlemmer_id, boder_navn, boder_id, boder_pris 
         FROM boder_has_medlemmer, 
          medlemmer, 
          boder 
         WHERE boder_boder_id = boder_id 
         AND medlemmer_medlemmer_id = medlemmer_id"); 

if (mysql_num_rows($result) == 0) 
{ 
    echo "Query returned 0 rows"; 
} 
else 
{ 
    $prev_medlemmer_navn = ''; 
    while($row = mysql_fetch_array($result)) 
    { 
     if ($prev_medlemmer_navn != $row['medlemmer_navn']) 
     { 
      unset($member_output); 
      $member_output = new member_output($row['medlemmer_navn']); 
      $prev_medlemmer_navn = $row['medlemmer_navn']; 
     } 
     $member_output->add_row($row['boder_navn'], $row['boder_pris']) 
    } 
    unset($member_output); 
} 

class member_output 
{ 
    private $medlemmer_navn = ''; 
    private $details = array(); 
    private $samlet = 0; 

    public function __CONSTRUCT($medlemmer_navn) 
    { 
     $this->medlemmer_navn = $medlemmer_navn; 
    } 

    public function __DESTRUCT() 
    { 
     echo "<p>"; 
     echo $this->medlemmer_navn.'<br />'; 
     foreach ($this->details as $detail) 
     { 
      echo $detail['boder_navn'].'<br />'; 
      echo $detail['boder_pris'].' kr.<br />'; 
     } 
     echo $this->samlet.'<br />'; 
     echo "</p>"; 
    } 

    public function add_row($boder_navn, $boder_pris) 
    { 
     $this->details[] = array('boder_navn'=>$boder_navn, 'boder_pris'=>$boder_pris); 
     $this->samlet += $boder_pris; 
    } 
} 

?> 

Или вы можете нажать большую часть работы на MySQL, группируя деталь вместе так что одна строка за имя, а затем взрыва остальные поля.

<?php 
mysql_connect("#######", "########", "######") or die(mysql_error()); 
mysql_select_db("#####") or die(mysql_error()); 

echo "<h3>Members:</h3>"; 

$result = mysql_query("SELECT medlemmer_navn, medlemmer_id, GROUP_CONCAT(CONCAT_WS('~~', boder_navn, boder_pris) SEPARATOR '##') AS details, SUM(boder_pris) AS samlet 
         FROM boder_has_medlemmer, 
          medlemmer, 
          boder 
         WHERE boder_boder_id = boder_id 
         AND medlemmer_medlemmer_id = medlemmer_id 
         GROUP BY medlemmer_navn, medlemmer_id"); 

if (mysql_num_rows($result) == 0) 
{ 
    echo "Query returned 0 rows"; 
} 
else 
{ 
    while($row = mysql_fetch_array($result)) 
    { 
     echo "<p>"; 
     echo $row['medlemmer_navn'].'<br />'; 
     $details = explode('##', $row['details']); 
     foreach ($details as $detail) 
     { 
      list($boder_navn, $boder_pris) = explode('~~', $detail); 
      echo $boder_navn.'<br />'; 
      echo $boder_pris.' kr.<br />'; 
     } 
     echo $row['samlet'].'<br />'; 
     echo "</p>";   
    } 
} 

?> 

Или немного грязное, создавая html в sql.

<?php 
mysql_connect("#######", "########", "######") or die(mysql_error()); 
mysql_select_db("#####") or die(mysql_error()); 

echo "<h3>Members:</h3>"; 

$result = mysql_query("SELECT medlemmer_navn, medlemmer_id, GROUP_CONCAT(CONCAT(boder_navn, '<br />', boder_pris, 'kr.', '<br />')) AS details, SUM(boder_pris) AS samlet 
         FROM boder_has_medlemmer, 
          medlemmer, 
          boder 
         WHERE boder_boder_id = boder_id 
         AND medlemmer_medlemmer_id = medlemmer_id 
         GROUP BY medlemmer_navn, medlemmer_id"); 

if (mysql_num_rows($result) == 0) 
{ 
    echo "Query returned 0 rows"; 
} 
else 
{ 
    while($row = mysql_fetch_array($result)) 
    { 
     echo "<p>"; 
     echo $row['medlemmer_navn'].'<br />'; 
     echo $row['details']; 
     echo $row['samlet'].'<br />'; 
     echo "</p>";   
    } 
} 

?> 
Смежные вопросы