连接子查询返回失败

时间:2011-10-09 09:16:45

标签: mysql join subquery

尝试将表“fab_qouta.qoutatype”连接到子查询“fab_status_members.statustype”中的值,但它不返回任何内容。

如果我在查询中直接加入2个表,结果是正确的。

像这样:

select statustype, takst 
from   
  fab_status_members AS sm
    join fab_quota as fq
      ON fq.quotatype = sm.statustype

所以我必须做错事,这里是子查询代码,任何帮助赞赏

select
  ju.id,
  name,
  statustype,
  takst

from jos_users AS ju 
  join 
    ( SELECT sm.Members AS MemberId, MaxDate , st.statustype 
      FROM fab_status_type AS st
        JOIN fab_status_members AS sm 
          ON (st.id = sm.statustype) -- tabels are joined 
        JOIN 
          ( SELECT members, MAX(pr_dato) AS MaxDate -- choose members and Maxdate from
            FROM fab_status_members 
            WHERE pr_dato <= '2011-07-01' 
            GROUP BY members
          )
          AS sq
          ON (sm.members = sq.members AND sm.pr_dato = sq.MaxDate)
     ) as TT
     ON ju.id = TT.Memberid
  join fab_quota as fq 
    ON fq.quotatype = TT.statustype 
GROUP BY id

猜猜问题在于:将fab_quota加入为fq ON fq.quotatype = TT.statustype

但我似乎无法透视它: - (

祝你好运

托马斯

1 个答案:

答案 0 :(得分:0)

看起来您正在加入每个成员的最低组合及其给定日期的最大pr_dato值。我会把它拉到第一个查询位置而不是被埋没,然后重新加入其余的......

select STRAIGHT_JOIN
      ju.id,
      ju.name,
      fst.statustype,
      takst
   from 
      ( SELECT 
              members, 
              MAX(pr_dato) AS MaxDate
           FROM 
              fab_status_members 
           WHERE 
              pr_dato <= '2011-07-01' 
           GROUP BY 
              members ) MaxDatePerMember

      JOIN jos_users ju
         on MaxDatePerMember.members = ju.ID

      JOIN fab_status_members fsm
         on MaxDatePerMember.members = fsm.members
        AND MaxDatePerMember.MaxDate = fsm.pr_dato

         JOIN fab_status_type fst
            on fsm.statustype = fst.id

            JOIN fab_quota as fq
               on fst.statusType = fq.quotaType

我认为我拥有你想要的所有东西,让我用简单的话语重申我的想法。每个成员可以有多个状态条目(通过Fab_Status_Members)。您正在寻找所有成员以及他们最近的状态是什么日期。这是第一个查询。

由此,无论用户是否符合条件,我都会加入用户表以获取他们的姓名信息(首次加入)。

现在,回到复杂的部分。从确定最近日期状态活动的第一个查询开始,重新连接回同一个表(fab_status_members)并获取该成员的最后状态日期(第二个连接)的实际状态代码SPECIFIC。

根据在最大日期获得每个成员的正确STATUS的结果,您需要获得代表所代表的状态类型(第三次加入fab_status_type)。

最后,从了解fab_status_type开始,它的配额类型是什么。

您不应该需要该组,因为第一个查询按成员ID分组,并且每个人将返回一个条目(UNLESS ...它可能在fab_status_members表中的同一天有多个状态类型。 ..除非那是一个完整的日期/时间字段,那你就可以了)

不确定“takst”列来自哪个表,但我尝试完全限定它们来自的表名(或别名),买我的猜测是来自QuotaType表。

...来自评论编辑

抱歉,是的,最后一次加入的FQ。至于它没有返回任何行,我会一次尝试一个,看看中断的位置......我会一次启动一个...从maxdate查询中有多少,然后将连接添加到用户进行确保返回相同的记录数。然后将特定成员/日期活动的FSM(重新加入)添加到状态类型...链中的某个地方缺少它,我唯一能想到的是状态类型错过任何成员状态必须与其中一个用户相关联,它应该找回自己,因为这是最大日期的起源。我正在将其加入到状态类型或配额的某个地方。