左JOIN查询返回仅在表2中存在的结果
我想改进现有的(PHP/MySQL)代码库,该代码库概述了合唱团的出勤率(X Axeis:DateS,Y Axis:a轴:学生)。 数据分布在各种表中(如您所见,非常完美的命名逻辑)。查询非常重,并且要为每个“合唱”重复,因此我正在尝试构建一种视图来优化后端代码。
所涉及的表格:
- Chorale_dates =本季
- Chorale_inscriptions的排练日期=合唱者的注册
- chorale_presences =记录的缺席(合唱者出勤)
- chorale_id = shorale_id =合唱者的个人详细信息(电子邮件,名称,姓名)
┌───────────────────────┐ ┌──────────────────────────────────┐ ┌───────────────────────┐
│ chorale_dates │ │chorale_presences │ │ chorale_inscription │
├───────────────────────┤ ├──────────────────────────────────┤ ├───────────────────────┤
│ │ │ │ │ │
│ chorale_date_id │ │chorale_presences_id ┌─┼──┤►chorale_inscription_id│
│ ▲ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ └────────┼──────┤chorale_presences_date_id │ │ │ chorale_id_id │
│ │ │ │ │ │ │ │
│ │ │chorale_presences_inscription_id│ │ │ │ │
│ │ │ │ │ │ │
│ │ │ │ │ │ │
└───────────────────────┘ └──────────────────────────────────┘ └─┼─────────────────────┘
│
│ ┌───────────────────────┐
│ │ chorale_id │
│ ├───────────────────────┤
│ │ │
└────────────► chorale_id_id │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
└───────────────────────┘
是生成视图的陈述:
CREATE VIEW `attendances` AS SELECT
`d`.`chorale_date_id` AS `date_id`,
`d`.`chorale_date` AS `date`,
`d`.`chorale_date_saison` AS `season_id`,
`d`.`chorale_date_type` AS `date_type`,
`d`.`chorale_date_chorale_id` AS `chorale_id`,
`d`.`chorale_date_etat` AS `date_etat`,
`p`.`chorale_presences_id` AS `absence_id`,
`p`.`chorale_presences_date_id` AS `chorale_presences_date_id`,
`p`.`chorale_presences_inscription_id` AS `chorale_presences_inscription_id`,
`i`.`chorale_inscription_id` AS `chorale_inscription_id`,
`p`.`chorale_presences_etat` AS `attendance`,
`i`.`chorale_inscription_pupitre` AS `chorale_inscription_pupitre`,
`p`.`chorale_presences_validation` AS `chorale_presences_validation`,
CONCAT( `c`.`chorale_id_nom`, ', ', `c`.`chorale_id_prenom`) AS `fullname`
FROM
(
(
(
`chorale_dates` `d`
LEFT JOIN `chorales_presences` `p` ON
(
(
`p`.`chorale_presences_date_id` = `d`.`chorale_date_id`
)
)
)
LEFT JOIN `chorale_inscription` `i` ON
(
(
`p`.`chorale_presences_inscription_id` = `i`.`chorale_inscription_id`
)
)
)
LEFT JOIN `chorale_id` `c` ON
(
(
`c`.`chorale_id_id` = `i`.`chorale_id_id`
)
)
)
ORDER BY d.season_id ASC, `d`.`chorale_date` ASC ;
因为这是一个左联接,所以我希望所有注册的合唱者都有所有季节的日期,如果Chorale_presence表中没有记录的缺席,则为空的“出勤”值,或者如果有匹配记录,则列值在该表中。无论是否有Chorale_presence中的条目,所有合唱者都应有37个条目。
但是,此视图返回的内容仅包含具有日期和缺勤的行。因此,根据合唱者的不同,我得到了不同的条目。
我在做什么错?
I would like to improve an existing (php/mysql) codebase that presents an overview of choir attendances (X axis: dates, Y axis: students).
The data is spread across various tables (and a very perfectible naming logic, as you will see). The query is quite heavy and to be repeated for each "chorist" so I am trying to construct a VIEW to optimize the backend code.
The involved tables:
- chorale_dates = the rehearsal dates for the season
- chorale_inscriptions = the chorists' registrations
- chorale_presences = the recorded absences (chorists attendances)
- chorale_id = the chorists' personal details (email, name, ...)
┌───────────────────────┐ ┌──────────────────────────────────┐ ┌───────────────────────┐
│ chorale_dates │ │chorale_presences │ │ chorale_inscription │
├───────────────────────┤ ├──────────────────────────────────┤ ├───────────────────────┤
│ │ │ │ │ │
│ chorale_date_id │ │chorale_presences_id ┌─┼──┤►chorale_inscription_id│
│ ▲ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ └────────┼──────┤chorale_presences_date_id │ │ │ chorale_id_id │
│ │ │ │ │ │ │ │
│ │ │chorale_presences_inscription_id│ │ │ │ │
│ │ │ │ │ │ │
│ │ │ │ │ │ │
└───────────────────────┘ └──────────────────────────────────┘ └─┼─────────────────────┘
│
│ ┌───────────────────────┐
│ │ chorale_id │
│ ├───────────────────────┤
│ │ │
└────────────► chorale_id_id │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
└───────────────────────┘
Here is the statement generating the view:
CREATE VIEW `attendances` AS SELECT
`d`.`chorale_date_id` AS `date_id`,
`d`.`chorale_date` AS `date`,
`d`.`chorale_date_saison` AS `season_id`,
`d`.`chorale_date_type` AS `date_type`,
`d`.`chorale_date_chorale_id` AS `chorale_id`,
`d`.`chorale_date_etat` AS `date_etat`,
`p`.`chorale_presences_id` AS `absence_id`,
`p`.`chorale_presences_date_id` AS `chorale_presences_date_id`,
`p`.`chorale_presences_inscription_id` AS `chorale_presences_inscription_id`,
`i`.`chorale_inscription_id` AS `chorale_inscription_id`,
`p`.`chorale_presences_etat` AS `attendance`,
`i`.`chorale_inscription_pupitre` AS `chorale_inscription_pupitre`,
`p`.`chorale_presences_validation` AS `chorale_presences_validation`,
CONCAT( `c`.`chorale_id_nom`, ', ', `c`.`chorale_id_prenom`) AS `fullname`
FROM
(
(
(
`chorale_dates` `d`
LEFT JOIN `chorales_presences` `p` ON
(
(
`p`.`chorale_presences_date_id` = `d`.`chorale_date_id`
)
)
)
LEFT JOIN `chorale_inscription` `i` ON
(
(
`p`.`chorale_presences_inscription_id` = `i`.`chorale_inscription_id`
)
)
)
LEFT JOIN `chorale_id` `c` ON
(
(
`c`.`chorale_id_id` = `i`.`chorale_id_id`
)
)
)
ORDER BY d.season_id ASC, `d`.`chorale_date` ASC ;
Because it is a LEFT JOIN, I am expecting to have all season dates for all registered chorists, and either an empty "attendance" value if there is no recorded absence in the chorale_presence table, or the column value if there is a matching record in that table. All chorists should have 37 entries, whether there is an entry in chorale_presence or not.
Yet, what this view returns only contains rows having date and an absence recorded. So depending on the chorist, I get varying amount of entries.
What am I doing wrong?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这是
cross
在chorale_dates
之间加入的定义。您存储合唱者的注册的位置:This is the definition of a
CROSS
join betweenchorale_dates
where you store the dates andchorale_inscriptio
where you store the chorists' registrations: