2010-08-17 77 views
1

我有一個包含活動的主要級別類別和子類別的目的地(州)表。我的最終目標是要輸出的XML導航鏈接,這樣我可以鏈接到:查詢選擇活動目的地類別的子類別?

  1. 每個目標永久(按目的地塞名字的字母順序排列)
  2. 類別
下每個子類別的各個類別

以下是我將用sql查詢生成的內容,因爲它對查詢有任何影響,但我不需要此問題的xml幫助

<item href="/destinations/alabama/"> 
    <list> 
     <item href="/destinations/alabama/category/"> 
      <list> 
       <item href="/destinations/alabama/category/sub-category/"></item> 
      </list> 
     </item> 
    </list> 
</item> 
<item href="/destinations/maryland/"> 
    <list> 
     <item href="/destinations/maryland/category/"> 
      <list> 
       <item href="/destinations/maryland/category/sub-category/"></item> 
      </list> 
     </item> 
    </list> 
</item> 

目前我有一個查詢可以獲取子類別,但它不會考慮活動目標。

SELECT 

subcategories.name AS subcategory_name, 
subcategories.slug AS subcategory_slug, 
categories.name AS category_name, 
categories.slug AS category_slug 

FROM 

subcategories 

LEFT JOIN destinations_subcategories ON 
destinations_subcategories.subcategory_id = subcategories.id 

LEFT JOIN categories ON 
destinations_subcategories.category_id = categories.id 

WHERE 
1=1 AND 
subcategories.is_active = 1 AND 
categories.is_active = 1 

將返回:

subcategory_name subcategory_slug category_name category_slug 
Fly Fishing   fly-fishing   Fishing   fishing 

但此查詢不考慮其目標是積極的,因爲它可能映射不活動的目的地和活動的類別之間的關係。我想我需要也許有一個子查詢抓住所有活動的目的地,然後加入?





SCHEMA /行樣品:

id name  slug  active 
7  Maryland maryland 1 

我的類別表,樣本行:

id name  slug  active 
1  Fishing fishing 1 

子類別表樣本行:

id name   slug   active 
3  Fly-Fishing fly-fishing 1 

甲ND 2個表來存儲的關係,第一個地圖子類別類別:

id category_id subcategory_id 
5  1    3 

第二,destinations_subcategories映射目的地子類別:

id destination_id category_id subcategory_id 
5  7    1    3 
+0

是不是mysql確定最佳連接順序? (不太確定它是否適用於標準的SQL語法) 如果你從a,b,c中選擇foo,那麼mysql和mysql會根據它的stat估計來確定連接順序。 – 2010-08-17 18:40:31

+0

我的意思是語法上,我將如何去修改此查詢,以便將活動目標考慮在內?我更新了問題標題。 – 2010-08-17 18:45:52

+0

mysql確定最佳連接順序 – 2010-08-17 18:47:10

回答

1

這個怎麼樣

SELECT 

subcategories.name AS subcategory_name, 
subcategories.slug AS subcategory_slug, 
categories.name AS category_name, 
categories.slug AS category_slug 

FROM 

destination 

INNER JOIN destinations_subcategories on destination.id = destinations_subcategories.destination_id and destination.active = 1 

LEFT JOIN subcategories ON destinations_subcategories.subcategory_id = subcategories.id 

LEFT JOIN categories ON destinations_subcategories.category_id = categories.id 

WHERE 1=1 
AND subcategories.is_active = 1 
AND categories.is_active = 1 

這將使確保只顯示活動目的地

+0

Ya謝謝,我想我有一段時間沒有SQL的心理失誤或什麼。保持克服這個問題。 – 2010-08-17 19:02:07

+0

這就是我更喜歡使用原生sql over orms的原因 – 2010-08-17 19:08:50

1
SELECT destination.name , categories.name, sub-category.name 
FROM 
destination_subcategories as ds, destinations, categories, subcategories 
WHERE 
ds.destination_id = destination.id and ds.catrgoy_id = category.id and ds.sub_category_id = sub_category.id and destination.is_active = 1 and categories.is_active = 1 and subcategory.is_active = 1; 

這看起來應該工作,除非,我誤解了架構。

相關問題