2014-09-10 149 views
0

我試圖找到一種方式來以更好的方式顯示我的實體關係。我的數據庫由3個表格組成:會員,費用和fees_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

是的,我知道這個想法很愚蠢,正如我指出的:)我會馬上測試你的建議。 – 2014-09-10 09:32:07

+1

完美的作品! Thx m8 :) – 2014-09-10 09:36:00

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>";   
    } 
} 

?> 

還是有點髒,建立在sql內的html。

<?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>";   
    } 
} 

?>