【问题标题】:How to display a MySQL Many to Many Relationship with PHP如何使用 PHP 显示 MySQL 多对多关系
【发布时间】:2019-07-10 21:10:39
【问题描述】:

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

              Location1    Location2    Location3    Location4
Facility1         x            x
Facility2                                   x            x
Facility3         x                                      x
Facility4         x            x

首先,我不确定在 MySQL 中将这些显示为表的最佳方式,然后我不确定如何使用 PHP 调用在网页上清楚地显示这些。

任何帮助将不胜感激

【问题讨论】:

  • 在 MySQL 中最有可能的三个表LocationFacilityLocation_has_Facility .. 存储位置(park) 的位置。如果 Location (park) 具有 Facility (toilets, swings, slide),则存储 Facility (toilets, swings, slide) 和 Location_has_Facility 的设施。
  • 谢谢!由此,我将使用什么 MySQL 查询来显示有厕所、秋千和滑梯的位置?

标签: php mysql


【解决方案1】:

数据库架构

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

  1. 位置
  2. 设施
  3. location_facility

位置表

+----+------------+
| id |    name    |
+----+------------+
|  1 | location_1 |
|  2 | location_2 |
+----+------------+

设施表

+----+------------+
| id |    name    |
+----+------------+
|  1 | facility_1 |
|  2 | facility_2 |
|  3 | facility_3 |
+----+------------+

数据透视表(location_facility)

+-------------+-------------+
| location_id | facility_id |
+-------------+-------------+
|           1 |           1 |
|           1 |           2 |
|           2 |           1 |
|           2 |           3 |
+-------------+-------------+

因此,您可以在数据透视表中存储所需的信息。

PHP 应用元代码

要使用纯 PHP 从数据库中获取数据 - 您可以使用 PDO 扩展名。

    $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";
    }

【讨论】:

  • 这真的很有帮助,显示了所有的位置和设施,谢谢!有没有办法缩小此搜索范围,使其不重复位置。例如,如果我要查询有厕所和秋千的位置?我尝试使用 WHERE facility.name LIKE '%Toilet%' AND facility.name LIKE '%Swing%' 但这不起作用。
  • 遗憾的是,我不认为这是一个拼写错误。我认为问题在于 WHERE 子句仅显示以“厕所”作为设施名称的行,因此,尝试搜索名为 swing 的设施会得到 0 个结果。
【解决方案2】:

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

为了显示,您可以选择“主-详细信息”视图:从任一表(主表)中选择一个项目,显示另一个表中的所有相关记录(详细信息)。

【讨论】:

    【解决方案3】:

    正如其他人所评论的那样,这些表需要第三个数据透视表来连接设施和位置表,非常感谢。但是,出现的下一个问题是使用这些表并将它们连接起来以允许按设施进行搜索。 因此,一个 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%
    

    这解决了我的问题,并允许数据完全按照我想要的方式显示在网页上。

    再次感谢 cmets 并帮助大家!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多