2011-08-08 68 views
1

我學會了艱難的方式,當我需要使其可搜索時,我不應該將序列化數據存儲在表中。在多(1-n)關係表上搜索

所以我做了3個表格基地&兩個1-n關係表。

enter image description here

因此,這裏是我的查詢得到,如果我想選擇一個特定的活動。

SELECT 
jdc_organizations_activities.id 
FROM 
jdc_activity_sector , 
jdc_activity_type 
INNER JOIN jdc_organizations_activities ON jdc_activity_type.activityId = jdc_organizations_activities.id 
AND 
jdc_activity_sector.activityId = jdc_organizations_activities.id 
WHERE 
jdc_activity_sector.activitySector = 5 AND 
jdc_activity_type.activityType = 3 

問題:

1 - 我可以添加在1-n的關係表什麼樣的指標,我已經有(activityId - activitySector)的獨特組合&(activityId - activityType)

2-是否有更好的方式來編寫查詢以獲得更好的性能?

謝謝!

+1

偏離主題,但我建議您堅持使用'JOIN'語法,而不是混入舊的'''連接語法。 – MatBailie

回答

3

我會重新組織查詢,以避免跨產品使用,表示法。

此外,您實際上只使用sectortype表作爲過濾器。所以先把activity表,然後加入你的其他表。

有人可能會建議;理想情況下,第一次加入應該是最有可能限制您的結果的加入,而在第二次加入時將剩下最少的工作量。實際上,在生成計劃時,sql引擎實際上可以重新安排您的查詢,但它確實有助於以這種方式來幫助您考慮sql引擎所要做的工作。

最後,每個表上都有索引。我真的建議倒車指數...
- ActivitySector THEN ActivityId
- ActivityType THEN ActivityId

這是專門因爲SQL引擎操作查詢。它可以採用WHERE子句並說「只包含來自扇區表的記錄,其中ActivitySector = 5」,對於類型表類似。通過讓Sector和Type在索引中標識FIRST,表格的這種過濾可以更快地完成,然後這些聯接的工作就會少得多。

SELECT 
    [activity].id 
FROM 
    jdc_organizations_activities AS [activity] 
INNER JOIN 
    jdc_activity_sector    AS [sector] 
    ON [activity].id = [sector].activityId 
INNER JOIN 
    jdc_activity_type    AS [type] 
    ON [activity].id = [type].activityId 
WHERE 
    [sector].activitySector = 5 
    AND [type].activityType = 3 

或者,因爲你沒有實際使用的活動表的內容...

SELECT 
    [sector].activityId 
FROM 
    jdc_activity_sector    AS [sector] 
INNER JOIN 
    jdc_activity_type    AS [type] 
    ON [sector].activityId = [type].activityId 
WHERE 
    [sector].activitySector = 5 
    AND [type].activityType = 3 

或...

SELECT 
    [activity].id 
FROM 
    jdc_organizations_activities AS [activity] 
WHERE 
    EXISTS (SELECT * FROM jdc_activity_sector WHERE activityId = [activity].id AND activitySector = 5) 
    AND EXISTS (SELECT * FROM jdc_activity_type WHERE activityId = [activity].id AND activityType = 3) 
+0

用於發現活動表未被使用的+1,很酷:) – Andomar

+0

反轉索引順序可能會使老實說更大的差異。 – MatBailie

+0

+1,但不應該使用'[]'語法,因爲這不適用於mysql,子查詢在這種情況下在mysql中也是一個壞主意。 –

1

我建議不要在一個查詢中混合舊式from table1, table2和新款式from table1 inner join table2 ...。使用IN

select a.id 
from  jdc_organizations_activities a 
join  jdc_activity_sector as 
on  as.activityId = a.Id 
join  jdc_activity_type as at 
on  at.activityId = a.Id 
where  as.activitySector = 5 
      and at.activityType = 3 

甚至更​​具可讀性:你可以別名使用table1 as t1表,縮短長表名容易記住mnenomic

select a.id 
from  jdc_organizations_activities a 
where  a.id in 
      (
      select activityId 
      from jdc_activity_sector 
      where activitySector = 5 
     ) 
      and a.id in 
      (
      select activityId 
      from jdc_activity_type 
      where activityType = 3 
     )