如何显示MySQL与PHP的多对多关系

如何显示MySQL与PHP的多对多关系,php,mysql,Php,Mysql,我正在尝试使用PHP和MYSQL在一个网站上显示信息,显示事件可以发生的所有位置,以及每个位置包含的设施。例如,公园(位置1)可能包含厕所(设施1)、秋千(设施3)和滑梯(设施4) 首先,我不确定在MySQL中以表的形式显示这些内容的最佳方式,以及如何在网页上使用PHP调用清楚地显示这些内容 任何帮助都将不胜感激在数据库中,它只是一个附加表,包含相关表中的两个PK 对于显示,您需要选择“主-详细信息”视图:从任一表(主)中选择一项,从另一表(详细信息)中显示所有相关记录。数据库模式 我建议您在数

我正在尝试使用PHP和MYSQL在一个网站上显示信息,显示事件可以发生的所有位置,以及每个位置包含的设施。例如,公园(位置1)可能包含厕所(设施1)、秋千(设施3)和滑梯(设施4)

首先,我不确定在MySQL中以表的形式显示这些内容的最佳方式,以及如何在网页上使用PHP调用清楚地显示这些内容


任何帮助都将不胜感激

在数据库中,它只是一个附加表,包含相关表中的两个PK

对于显示,您需要选择“主-详细信息”视图:从任一表(主)中选择一项,从另一表(详细信息)中显示所有相关记录。

数据库模式 我建议您在数据库中创建3个表:

  • 地点
  • 设施
  • 地点和设施
  • 位置表

    +----+------------+
    | id |    name    |
    +----+------------+
    |  1 | location_1 |
    |  2 | location_2 |
    +----+------------+
    
    +----+------------+
    | id |    name    |
    +----+------------+
    |  1 | facility_1 |
    |  2 | facility_2 |
    |  3 | facility_3 |
    +----+------------+
    
    设施表

    +----+------------+
    | id |    name    |
    +----+------------+
    |  1 | location_1 |
    |  2 | location_2 |
    +----+------------+
    
    +----+------------+
    | id |    name    |
    +----+------------+
    |  1 | facility_1 |
    |  2 | facility_2 |
    |  3 | facility_3 |
    +----+------------+
    
    数据透视表(位置设施)

    所以,在pivot表中可以存储所需的信息

    PHP应用程序元代码 要用纯PHP从数据库中获取数据,可以使用扩展名

        $sql = 'SELECT locations.name as loc_name, 
                       facilities.name as facility_name 
                FROM location_facility
                INNER JOIN locations ON locations.id = location_facility.location_id
                INNER JOIN facilities ON facilities.id = location_facility.facility_id';
    
        foreach ($conn->query($sql) as $row) {
            print $row['loc_name'] . "\t";
            print $row['facility_name'] . "\n";
        }
    

    正如其他人所评论的,这些表需要第三个透视表来连接设施和位置表,非常感谢。然而,出现的下一个问题是使用这些表并连接它们以允许按设施进行搜索。 因此,SQL查询将设施分组到视图中的一列中,与位置表中的所有信息一起

    CREATE VIEW locations AS
    SELECT location.*, group_concat(facilities.FacilityName separator ',') AS facility_name 
    FROM location_facility 
    INNER JOIN location 
    ON location.LocationID = location_facility.LocationID
    INNER JOIN facilities 
    ON facilities.FacilitiesID = location_facility.FacilitiesID
    GROUP BY location.LocationName  
    ORDER BY location.LocationID ASC
    

    可以使用以下命令查询此表:

    SELECT *
    FROM locations
    WHERE facility_name LIKE %Toilet% AND facility_name LIKE %Parking%
    
    这解决了我的问题,并允许数据显示在网页上,这正是我所希望的


    再次感谢大家的评论和帮助

    在MySQL中,最有可能有三个表
    Location
    Facility
    Location\u拥有\u Facility
    。。存储位置的位置
    (停车场)
    。如果一个地点
    (公园)
    有一个设施
    (厕所、秋千、滑梯)
    ,那么你可以在那里存放设施
    (厕所、秋千、滑梯)
    。谢谢!从这里,我将使用什么MySQL查询来显示有厕所、秋千和滑梯的位置?这非常有用,并显示了所有的位置和设施,谢谢!有没有办法缩小搜索范围,这样就不会重复搜索。例如,如果我要查询有厕所和秋千的位置?我尝试使用WHERE facility.name(如“%Toilet%”)和facility.name(如“%Swing%”),但都没有成功。遗憾的是,我不认为这是一个打字错误。我认为问题在于WHERE子句仅显示以“厕所”作为设施名称的行,因此,尝试搜索名为swing的设施会在0个结果中产生结果。