带有WHERE子句的MySQL JOIN表

时间:2011-12-09 17:27:16

标签: mysql

我需要从两个具有不同列的mysql表中收集帖子,并为每组表提供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的老手。我是最初的初学者...有什么建议吗?

3 个答案:

答案 0 :(得分: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
  ....

答案 1 :(得分:0)

自SQL相关新手以来,有两条建议。对表使用“别名”有助于减少SuperLongTableNameReferencesForColumns,并始终限定查询中的列名。它可以帮助您的生活变得更轻松,任何人都可以更好地了解哪些列来自哪个表,特别是如果不同表中的列名相同。防止查询中的歧义。我认为,你的左连接来自样本,可能是不明确的,但确认B.ID与TB.ID的连接?通常情况下,“Team_ID”会在团队表中出现一次,并且每个blabbing条目都可以具有此类发布所来自的“Team_ID”,以及其对于blabbing表的唯一键指示符的OWN“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“OR”

编辑 - 根据您的评论

这可以通过多种方式完成,例如动态SQL构建和执行,多次调用,每个ID一次并合并结果,或者另外,通过连接到另一个被清除的临时表说...每天。

如果您有另一个表,例如“TeamJoins”,并且它说... 3列:日期,会话ID和team_id,您可以每天从一天的查询中清除任何内容,和/或继续清除每个通过相同的会话ID对新查询进行计时(因为它来自PHP)。有两个索引,一个在日期(简化任何每日清除),第二个用于连接(sessionID,team_id)。

然后,循环执行插入到“TempJoins”表中,并识别出简单元素。

然后,您可以将该部分更改为

,而不是硬编码列表IN
   ...
 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

答案 2 :(得分:0)

我最终做的是;

  • 我在名为blabbing的{​​{1}}表中添加了一个额外的列,并将其设置为null以及team_id表中名为team_blabbing
  • 的另一个字段
  • 然后我更改了插入脚本,以便在mem_id中的mem_id中插入一个值。
  • 执行此操作后,我在查询中执行了一个简单的UNION ALL:

    team_blabbing

我对任何想法都持开放态度。尽量不要过于苛刻:)再次感谢所有信息。