2011-12-14 87 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