LEFT JOIN 查询 returns 仅结果存在于 table 2
LEFT JOIN query returns only results existing in table 2
我想改进现有的 (php/mysql) 代码库,该代码库提供了合唱团出席情况的概览(X 轴:日期,Y 轴:学生)。
数据分布在各种 table 中(以及非常完美的命名逻辑,如您所见)。查询非常繁重,每个“合唱团”都要重复查询,所以我试图构建一个 VIEW 来优化后端代码。
涉及的table人:
- chorale_dates = 本赛季的排练日期
- chorale_inscriptions = 合唱团登记
- chorale_presences = 记录的缺席(唱诗班出席)
- chorale_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 ;
因为它是一个 LEFT JOIN,我希望所有注册合唱团都有所有季节日期,如果 chorale_presence table,或者如果 table 中有匹配记录,则为列值。无论chorale_presence中是否有条目,所有合唱团都应该有37个条目。
然而,此视图 returns 仅包含记录了日期和缺席的行。因此,根据合唱团的不同,我会收到不同数量的条目。
我做错了什么?
I am expecting to have all season dates for all registered chorists
这是存储日期的 chorale_dates
和存储唱诗班登记的 chorale_inscriptio
之间的 CROSS
联接的定义:
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 CROSS JOIN chorale_inscription i
LEFT JOIN chorales_presences p ON p.chorale_presences_date_id = d.chorale_date_id AND 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;
我想改进现有的 (php/mysql) 代码库,该代码库提供了合唱团出席情况的概览(X 轴:日期,Y 轴:学生)。 数据分布在各种 table 中(以及非常完美的命名逻辑,如您所见)。查询非常繁重,每个“合唱团”都要重复查询,所以我试图构建一个 VIEW 来优化后端代码。
涉及的table人:
- chorale_dates = 本赛季的排练日期
- chorale_inscriptions = 合唱团登记
- chorale_presences = 记录的缺席(唱诗班出席)
- chorale_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 ;
因为它是一个 LEFT JOIN,我希望所有注册合唱团都有所有季节日期,如果 chorale_presence table,或者如果 table 中有匹配记录,则为列值。无论chorale_presence中是否有条目,所有合唱团都应该有37个条目。
然而,此视图 returns 仅包含记录了日期和缺席的行。因此,根据合唱团的不同,我会收到不同数量的条目。
我做错了什么?
I am expecting to have all season dates for all registered chorists
这是存储日期的 chorale_dates
和存储唱诗班登记的 chorale_inscriptio
之间的 CROSS
联接的定义:
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 CROSS JOIN chorale_inscription i
LEFT JOIN chorales_presences p ON p.chorale_presences_date_id = d.chorale_date_id AND 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;