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_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;