mysql - 为公共(public)表属性编写多对多查询

标签 mysql

我已经很长时间没有直接使用 MySQL 了,所以为了好玩,我有一个基于纽约地铁系统的 MySQL 列车信息数据库。我有一个 Station 表和 Route 表,两者之间存在多对多关系。

我想要做的是找出两条或更多条不同路线有哪些共同点。我正在尝试不同的连接技术,但它们似乎都不起作用(我可能语法错误)。

例如,我想查看哪些车站同时提供路线“1”和“2”(即这些路线有哪些公共(public)车站?)。

mysql> describe station;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(45) | YES  | UNI | NULL    |                |
+-------+-------------+------+-----+---------+----------------+

mysql> describe route;
+-------+------------+------+-----+---------+----------------+
| Field | Type       | Null | Key | Default | Extra          |
+-------+------------+------+-----+---------+----------------+
| id    | int(11)    | NO   | PRI | NULL    | auto_increment |
| name  | varchar(4) | YES  |     | NULL    |                |
+-------+------------+------+-----+---------+----------------+

它们之间的表称为 RouteStation,它具有两个表中每个表的 ID。

我想要的查询是查找为任意一组路线提供服务的车站名称。因此,在这个示例中,我想查找为路线“1”和“2”提供服务的车站名称。

SELECT Station.name FROM Station
    JOIN RouteStation ON (Station.id = RouteStation.stationId)
    JOIN Route ON (Route.id = RouteStation.routeId)
WHERE Route.name = "1" AND Route.name = "2";

我知道最后一部分可能有问题,因为路线名称不可能同时为“1”和“2”,但我希望我正在寻找的要点是够清楚了。

编辑:RouteStation 架构:

mysql> describe routestation;
+-----------+---------+------+-----+---------+-------+
| Field     | Type    | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| stationId | int(11) | NO   | MUL | NULL    |       |
| routeId   | int(11) | NO   | MUL | NULL    |       |
+-----------+---------+------+-----+---------+-------+

最佳答案

你能试试这个吗:

SELECT name
    FROM station
    WHERE id IN (
        SELECT RS.stationId
            FROM RouteStation RS
            WHERE RS.routeId IN (1, 2)
            GROUP BY RS.stationId  
            HAVING COUNT(RS.routeId) > 1
    )

不应使用 AND,而应使用 OR 关键字:routeId = 1 OR routeId = 2。与 IN 关键字相同。

之后,我们使用了GROUP BY stationId,这样我们就可以COUNT routeIds,因为我们只需要HAVING的车站 多于 1 条路线。

关于mysql - 为公共(public)表属性编写多对多查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35762274/

相关文章:

php - 我应该如何命名关系数据库中的字段?

mysql - Laravel 多对多关系OrderBy

php - 使用 PHP 和 ID 字段对 MySQL 结果进行分组

mysql - 将 CSV 导入 MySQL - 偏移 1 列

mysql - mysql 中的 Timediff 不返回结果

mysql - 按多个表mysql中的重复项数量排序

MySQL LIKE 关键字未返回预期结果

MySQL:将类型从 TIME 更改为 DATETIME 并获取存储的时间

MySQL 为依赖表生成 sql 插入

mysql - 如何使用 mysqldump 仅转储创建数据库语句