2011-12-14 103 views
1

我不能完全理解這個特定問題,我希望你能提供幫助。我對MySQL並不是太糟糕,但肯定還是個初學者。爲了節省您的時間,我已經將問題分解成最簡單的元素。你需要的任何進一步的信息,只要讓我知道它是什麼,我會直接彈出它。根據子查詢填充列值

我有3個表:動物,所有者和區域

動物表保存所有關於每隻動物的相關數據,以及一個OWNERID柱,它引用了所有者表的ID列。 所有者表類似,並且持有RegionID列(作爲每個所有者地址的一部分),引用區域表的ID列。 我希望在動物表上創建一個列,記錄其擁有者的RegionID。有沒有更新我可以運行將複製這些數據?如果任何人都可以通過這個過程來談論我,我會非常感激。

我的理想最終結果是能夠根據位置(從其所有者位置假定的位置)搜索動物。與RegionID在動物表中的列將允許我(在我的能力水平),這樣做簡單,作爲進一步查詢的一部分

#EDIT

基本查詢:

$base= "SELECT p.ID, p.Name, p.Prefix, CONCAT_WS(' ', p.Prefix, p.Name) AS ProfileName, 
     p.LocalRegNumber, p.GenderID, p.RegulatorID, 
     p.ColourID, prm_colour.Name AS Colour, p.origColour, 
     p.DiluteID, prm_dilute.Name AS Dilute, 
     p.ModifierID, prm_modifier.Name AS Modifier, 
     p.PatternID, prm_pattern.Name AS Pattern, 
     p.DateofBirth, p.DateofDeath, 
     EXTRACT(YEAR FROM p.DateofBirth) AS bYear, EXTRACT(YEAR FROM p.DateofDeath) AS dYear, 
     p.SireReg, p.DamReg, 
     p.OwnerID, p.BreederID, 
     CONCAT_WS(' ', s.Prefix, s.Name) AS SireName, 
     CONCAT_WS(' ', d.Prefix, d.Name) AS DamName, 
     CONCAT_WS(' ', o.Firstname, o.Lastname) AS OwnerName, 
     CONCAT_WS(' ', b.Firstname, b.Lastname) AS BreederName, 
     prm_gender.Name AS Gender 
       FROM profiles AS p 
        LEFT JOIN profiles AS s 
         ON p.SireReg = s.LocalRegNumber 
        LEFT JOIN profiles AS d 
         ON p.DamReg = d.LocalRegNumber 
          LEFT JOIN prm_colour 
           ON p.ColourID = prm_colour.ID 
          LEFT JOIN prm_dilute 
           ON p.DiluteID = prm_dilute.ID 
          LEFT JOIN prm_modifier 
           ON p.ModifierID = prm_modifier.ID 
          LEFT JOIN prm_pattern 
           ON p.PatternID = prm_pattern.ID 
        LEFT JOIN prm_gender 
           ON p.GenderID = prm_gender.ID 
          LEFT JOIN contacts AS o 
           ON p.OwnerID = o.ClientRef 
          LEFT JOIN contacts AS b 
           ON p.BreederID = b.ClientRef 
           "; 

我再通形成數據以獲得應用哪些過濾器(位置,年齡等)。舉個例子,如果搜索由業主:

$where = "WHERE (p.OwnerID = '$ownedby')"; 

我再構造查詢:

$complete=$base.$where; 
$q= mysql_query($complete); 
+0

不要使用UPDATE來複制信息。使用JOIN進行搜索。 – simon 2011-12-14 18:46:49

回答

1

可以複製到您animal表信息,但不會是你最好只使用一個JOIN當你需要執行搜索?

SELECT * FROM animal 
    INNER JOIN owner ON animal.owner_id = owner.id 
    INNER JOIN region ON owner.region_id = region.id 
WHERE region.name = "myregion"; 

,如果你需要訪問該查詢了很多,你可以考慮從該查詢作出VIEW了。

1

你沒有,你不應該這樣做。 Animal表中不需要額外的RegionId列。要在一定區域seacrh的動物,說: 「得克薩斯州」,使用此:

SELECT a.* 
FROM Animal AS a 
WHERE OwnerId IN 
     (SELECT OwnerId 
     FROM Owner 
     WHERE RegionID IN 
       (SELECT RegionId 
       FROM Region 
       WHERE RegionArea = 'Texas'   --- example 
      ) 
    ) 

或(通常是更好的性能):

SELECT a.* 
FROM Animal AS a 
    JOIN Owner AS o 
    ON o.OwnerId = a.OwnerId 
    JOIN Region AS r 
    ON r.RegionId = o.RegionId 
WHERE r.RegionArea = 'Texas' 

的原因,你不想複製數據是相同的原因,normalization好:

normalizatio的目標n超出1NF(第一範式)由Codd陳述如下:

  1. 爲了從不希望的插入,更新和刪除依賴關係中收集關係;
  2. 爲了減少引入新類型數據時重組關係集合的需求,從而延長應用程序的使用壽命;
  3. 使關係模型對用戶更具信息性;
  4. 使關係的收集與查詢統計無關,這些統計隨着時間的推移可能會發生變化。

想想在你的場景中會發生什麼,如果一個業主轉移到另一個地區。除了他自己的RegionId之外,所有相關的動物行也必須更新。

你也可以(錯誤地)使用與其所有者不同的RegionId

+0

看起來不錯!實際上這可能適合我的法案。我沒有真正使用過IN子句,所以不習慣把它當作一種選擇。我會試試看,並感激地接受。出於興趣,因爲我正在學習,如果我需要這樣做,那麼如何寫下這些值呢? – Eamonn 2011-12-14 18:48:14

+0

取決於MySQL的確切版本,使用連接而不是子查詢是_far_首選 – simon 2011-12-14 18:48:56