我需要从两个具有不同列的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的老手。我是最初的初学者...有什么建议吗?
答案 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
我对任何想法都持开放态度。尽量不要过于苛刻:)再次感谢所有信息。