【发布时间】:2012-04-22 03:14:11
【问题描述】:
我有一个由 7 个表组合而成的 select 语句
SELECT * (//instead of * i put in my code the proper columns i need from the selected tabls)
FROM
ev_events_eve
LEFT JOIN ev_events_multilang_evmulti ON ev_events_multilang_evmulti.event_evmulti = ev_events_eve.id_eve
LEFT JOIN ev_schedule_sch ON ev_schedule_sch.event_id_sch = ev_events_eve.id_eve
LEFT JOIN ev_events_type_et ON ev_schedule_sch.event_type_id_sch = ev_events_type_et.id_et
LEFT JOIN ev_events_type_multilang_etmulti ON ev_events_type_multilang_etmulti.idevent_type_etmulti = ev_events_type_et.id_et
LEFT JOIN ev_schedule_multilang_schmulti ON ev_schedule_multilang_schmulti.id_schedule_schmulti = ev_schedule_sch.id_sch
LEFT JOIN ev_timetable_tt ON ev_timetable_tt.schedule_id_tt = ev_schedule_sch.id_sch AND ev_timetable_tt.event_id_tt = ev_events_eve.id_eve
WHERE (ev_events_eve.active_eve = 1 AND ev_schedule_multilang_schmulti.iso_code_lang_schmulti = '{$current_language}' AND ev_schedule_sch.active_sch = 1) AND
ev_timetable_tt.end_date_tt > CURDATE() OR (ev_timetable_tt.weekday_tt = DAYNAME(CURDATE()) AND ev_timetable_tt.end_date_tt > CURDATE()) OR ev_timetable_tt.specific_date_tt > CURDATE()
ORDER BY ev_timetable_tt.start_date_tt ASC LIMIT 3
这个语句忽略where子句的问题,每次我使用mysql时,我都会创建示例sql语句,由两个或三个具有正常左连接或内连接的表组成,我需要有人与我讨论这个问题,它可以让我进一步了解我的代码中没有提到的东西,但是我知道上面的代码不足以让任何人与我一起处理这个问题,但我需要有人可以与我讨论
我用以下信息更新了问题
主要业务规则:
- 该项目适用于多语言网站
- 这些表格是:
-
ev_events_eve(事件实体,如 id、徽标、标语、开始和结束 整个活动的日期)-
ev_events_multilang_evmulti(主赛事多语言表 表格,例如名称(en、fr、gr .. 等)、描述...等) -
ev_schedule_sch(调度实体,如 id、事件表的外键) -
ev_schedule_multilang_schmulti(多语言表为主 时间表) -
ev_timetable_tt(存储与相关的开始和结束日期和时间 ev_schedule_sch 表)
-
-
- 每个表都被复制到两个表中,其中一个用于存储
实体和另一个用于存储多语言数据
- 表之间的关系
- 主表是 ev_events_eve
-
ev_events_multilang_evmulti通过外部关联到主表 键 -
ev_schedule_sch related通过外键到主表 -
ev_schedule_multilang_schmulti与ev_schedule_sch表相关,通过 外键 -
ev_timetable_tt通过外键与ev_schedule_sch相关
我需要编写一个语句来从事件表中检索传入的 3 行(假设我需要检索最新的 3 行,因为您没有所有字段的完整架构,稍后我们可以在WHERE 子句 :) ) 以及这 3 行还从与事件表中的每一行相关的计划表中检索 6 行 所以估计的结果一定是这样的 假设我有 4 个事件
-
第一个被调用:事件#1
-
此事件在日程相关表中有 3 行(所以检索
所有这些行)
-
此事件在日程相关表中有 3 行(所以检索
-
第二次被调用:事件#2
-
这在计划相关表中有 11 行(仅检索 6
他们的行)
-
这在计划相关表中有 11 行(仅检索 6
他们的行)
-
第 3 个被调用:event#3
-
此事件在日程表中没有任何与其相关的行
相关表
-
此事件在日程表中没有任何与其相关的行
相关表
-
第 4 次调用:事件#4
- 此事件在相关日程表中只有 1 行与之相关 表格
如上所述,我只需要检索日程表中的前 3 个事件和相关事件
【问题讨论】:
-
这七个总是存在还是需要外连接?
-
就像您指出的那样,很难回答您的问题,因为它的表述非常糟糕。请提供该语句如何“忽略 where 子句”的示例。我可以根据经验说这种情况不太可能发生,查询本身可能是不正确的。您期望退回什么,您会得到什么?
-
您可能需要检查所有由 AND 和 OR 分隔的段是否正确包裹在括号中,如果不这样做可能会出现意外的逻辑解释
-
@Johnnyoh 我刚刚编辑了我的问题,并附上了我需要做的完整示例
-
一个使查询“更小”且更具可读性的示例提示:LEFT JOIN ev_events_multilang_evmulti AS evm ON ...
标签: mysql