2011-12-09 142 views
0

我需要从两个具有不同列的mysql表中收集帖子,并为每组表提供一个WHERE子句。感谢您的帮助,提前致谢。MySQL JOIN表与WHERE子句

这是我曾尝试...

SELECT 
    blabbing.id, 
    blabbing.mem_id, 
    blabbing.the_blab, 
    blabbing.blab_date, 
    blabbing.blab_type, 
    blabbing.device, 
    blabbing.fromid, 
    team_blabbing.team_id 
FROM 
    blabbing 
LEFT OUTER JOIN 
    team_blabbing 
ON team_blabbing.id = blabbing.id 
WHERE 
    team_id IN ($team_array) || 
    mem_id='$id' || 
    fromid='$logOptions_id' 
ORDER BY 
    blab_date DESC 
LIMIT 20 

我知道,这是混乱的,但我得承认,我没有mysql的老将。我是最好的初学者......有什么建议吗?

+1

我不太确定你的问题是什么。 – RedFilter

+0

就像你可以看到这些表格有一个不常见的“team_id”列。我需要能够为每个表设置where子句并在变量中使用team_id。这有帮助吗? –

回答

0

我最终什么事做的是;

  • 我增加了一个额外的列我叫team_idblabbing表,并将其设置为null以及另一场在我team_blabbing表叫mem_id
  • 然后,我改变插入脚本还插入一个值mem_idteam_blabbing
  • 这样做之后,我做了一个简单的UNION ALL查询:

    SELECT 
        * 
    FROM 
        blabbing 
    WHERE 
        mem_id='$id' OR 
        fromid='$logOptions_id' 
    UNION ALL 
    SELECT 
    * 
    FROM 
        team_blabbing 
    WHERE 
        team_id 
    IN 
        ($team_array) 
    ORDER BY 
        blab_date DESC 
    LIMIT 20 
    

我愿意对我所做的任何想法。尽量不要太苛刻,但:)再次感谢所有的信息。

1

你可以把在WHERE子句中的子查询:

select 
    * 
from 
    (select * from ... where ...) as alias1 -- this is a subquery 
left outer join 
    (select * from ... where ...) as alias2 -- this is also a subquery 
on 
    .... 
order by 
    .... 

请注意,您不能在视图定义中使用子查询这个样子。

你也可以结合where子句,就像你的例子。使用表别名来区分不同表的列(即使不需要使用别名也是一个好主意,仅仅因为它使事情变得更容易阅读)。例如:

select 
    * 
from 
    <table> as alias1 
left outer join 
    <othertable> as alias2 
on 
    .... 
where 
    alias1.id = ... and alias2.id = ... -- aliases distinguish between ids!! 
order by 
    .... 
0

由于在SQL中有一个相对的新手,所以有两条建议。对表使用“别名”来帮助减少SuperLongTableNameReferencesForColumns,并始终限定查询中的列名。它可以帮助你的生活变得更加轻松,任何人在你之后都能更好地了解哪些列来自哪个表,特别是如果不同表中的列名相同。防止查询中出现歧义。我认为,从样本来看,你的左派可能是模糊的,但是确认B.ID加入TB.ID?通常情况下,一个“Team_ID”会在小组表中出现一次,除了其自身的“ID”外,每个blabbing条目还可以具有此类发布所来自的“Team_ID”。

SELECT 
     B.id, 
     B.mem_id, 
     B.the_blab, 
     B.blab_date, 
     B.blab_type, 
     B.device, 
     B.fromid, 
     TB.team_id 
    FROM 
     blabbing B 
     LEFT JOIN team_blabbing TB 
      ON B.ID = TB.ID 
    WHERE 
     TB.Team_ID IN (you can't do a direct $team_array here) 
     OR B.mem_id = SomeParameter 
     OR b.FromID = AnotherParameter 
    ORDER BY 
     B.blab_date DESC 
    LIMIT 20 

你在哪里尝试$ team_array,你就必须打造出完整列表如预期,如

TB.Team_ID IN(1,4,18,23,58)

此外,不符合逻辑“||”或者,但SQL“或”

编辑 - 根据您的评论

这可以通过多种方式,如动态SQL构建和执行来完成,每一个ID多次调用,一旦和合并结果,或者,另外,通过加入另一个临时表,每天清理出来。

如果您有其他表格,例如“TeamJoins”,并且它有... 3列:日期,sessionid和team_id,您可以每天清除任何疑问,并且/或者继续清除每次使用相同的会话ID进行新查询(因为它看起来来自PHP)。有两个索引,一个在日期(以简化每日清除),另一个在会话(sessionID,team_id)上。

然后,循环执行以插入带有所标识的简单元素的“TempJoins”表。

然后,而不是硬编码的列表,你可以是部分更改为

... 
FROM 
     blabbing B 
      LEFT JOIN team_blabbing TB 
      ON B.ID = TB.ID 
      LEFT JOIN TeamJoins TJ 
       on TB.Team_ID = TJ.Team_ID 
    WHERE 
     TB.Team_ID IN NOT NULL 
     OR B.mem_id ... rest of query 
+0

谢谢,我会尽力回复你。 –

+0

如果数组在不使用变量的情况下不断变化,我怎样才能获得$ team_array输出? –

+0

@JuanGonzales,修改后的答案选项。 – DRapp