2013-08-19 161 views
6

目前,我有,我用這個語句來獲得一切從服務以及其相關的表一個SQL和PHP的問題:MySQL的逗號分隔值

$db = $this->getDbo(); 
$query = $db->getQuery(true); 

// Select the required fields from the table. 
$query->select(
     $this->getState(
       'list.select', 'a.*' 
     ) 
); 

$query->from('`#__services_service` AS a'); 
$query->where("a.zone"); 

$query->select('zone.name AS zone, zone.description AS zone_description, zone.price AS zone_price, zone.interval_recommended AS interval_recommended'); 
$query->join('LEFT', '#__services_zones AS zone ON zone.id = a.zone'); 

$query->select('category.icon AS category'); 
$query->join('LEFT', '#__services_categories AS category ON category.id = a.category'); 

但在區表我加盟,也有逗號分隔值'1,2',創建一個關聯數組並將服務分組到其區域後,單數服務僅進入單一區域,而不是在表中的值爲'1,2'時它應該在區域...我有一種感覺,這是因爲'zone.name AS zone',因爲那麼它只返回一個名稱,如果我說'zone AS zone'它返回逗號分隔數字...

下面是如何排序的數組:

foreach($this->items as $item){ 
if(!isset($zones[ $item->zone ])) 
$zone_items[ $item->zone] = array(); 
$zone_items[ $item->zone ][] = $item; 

    $zones[$item->zone] = array(
     'zone' => $item->zone, 
     'zone_interval' => $item->interval_recommended, 
     'zone_description' => $item->zone_description, 
     'zone_price' => $item->zone_price, 
     'items' => $zone_items[$item->zone] 
    ); 

} 

,我通過它顯示:

<?php foreach($zones as $zone): ?> 
    <div class="row-fluid zones-page"> 
     <div class="row-fluid zone-title-block"> 
      <div class="span4 zone-name"><h1><?php echo $zone['zone']; ?></h1></div> 
      <div class="span7 zone-description"> 
       <?php echo $zone['zone_description']; ?> 
       <?php if($zone['zone_interval'] == 1): ?> 
        <span class="interval pull-right">Interval Recommended</span> 
       <?php endif; ?> 
      </div> 
     </div> 

     <?php foreach($zone['items'] as $items) :?> 
     <div class="row-fluid zone-services-contain"> 
      <div class="span1"><div class="zone-icon"><?php //echo $items->category; ?></div></div> 
      <div class="span11 zone-services"> 
       <h4><?php echo $items->name; ?></h4> 
       <div><?php echo $items->description; ?></div> 
      </div> 
     </div> 
     <?php endforeach; ?> 

     <div class="row-fluid zone-amount"> 
      only <div><?php echo 'R' . $zone['zone_price']; ?></div> 
     </div> 
    </div> 
    <div class="bicycle-divider"> 
     <div class="bicycle-icon"></div> 
    </div> 
<?php endforeach; ?> 

任何幫助是極大的讚賞。

Services表如下所示:

enter image description here

而且Zones表:

enter image description here

+0

桌子是什麼樣的? –

+0

哪一個?..服務,區域或類別? –

+0

區域表。 –

回答

8

這就是爲什麼人們通常使用鏈接表處理許多一對多的關係喜歡這個。一個服務可以有多個區域,一個區域可以有多個服務。查詢逗號分隔的字段並在與另一個表的連接中使用它非常困難。

您有兩個選擇,其中一個涉及正確的方法,一個允許您保留當前的數據庫模型。我強烈建議你以正確的方式做,但要回答你的問題,我會首先進入其他選項。

只需分開您的查詢。只是讓你的主查詢用逗號分隔的字段,然後運行第二個查詢,以獲得區域名稱:

SELECT * FROM zone WHERE id IN ($zoneIdsYouSelected) 

現在,如果你與上市工作,這可能不是很高性能的,因爲這意味着你必須爲列表運行一個查詢,爲每一行運行另一個查詢。另一種方法是將所有區域放入一個數組中,然後使用基於$zoneIdsYouSelected的PHP進行選擇。通過這種方式,如果您計劃實現一個查詢,則可以使用兩個查詢,而不是每個數據行一個查詢。

正確的方法包括製備,僅僅包含兩個字段鏈接表:zone_idservice_id。如果你那麼做這樣的查詢,你會得到一個「場」的所有名字在結果集中:

SELECT s.id, s.name, s.description, s.price, s.category, s.ordering, 
     s.state, s.checked_out, s.checked_out_time, s.created_by, 
     GROUP_CONCAT(DISTINCT z.name ORDER BY z.name ASC SEPARATOR ', ') AS zones 
FROM  service s JOIN service_zone sz ON s.id = sz.service_id 
     JOIN zone z ON z.id = sz.zone_id 
GROUP BY s.id, s.name, s.description, s.price, s.category, s.ordering, 
     s.state, s.checked_out, s.checked_out_time, s.created_by 
ORDER BY s.id 

你可能需要調整該查詢了一下,但我希望這是明確的。請記住,GROUP_CONCAT不受所有數據庫支持,但MySQL擁有它。

同樣,這兩種解決方案都可以正常工作,並且性能卓越,但使用逗號分隔的字段會產生更多問題,就像這樣。我強烈建議你改變你的數據庫結構。如果您不熟悉鏈接表的想法,請閱讀數據庫標準化。

+0

哇謝謝!,從來沒有想過連接表......嘿,當然是正確的方式!做什麼,知道它錯了什麼?非常感謝..不愉快的嘗試:D –