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

时间:2019-07-02 17:58:57

标签: php mysql

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

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

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

任何帮助将不胜感激

3 个答案:

答案 0 :(得分:0)

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

为进行显示,您将选择一个“主从详细信息”视图:从任一表(主)中选择一项,从另一表(详细信息)中显示所有相关记录。

答案 1 :(得分:0)

数据库架构

我建议您在数据库中创建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";
    }

答案 2 :(得分:0)

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

Created view showing grouped facilities

可以使用

查询该表
SELECT *
FROM locations
WHERE facility_name LIKE %Toilet% AND facility_name LIKE %Parking%

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

再次感谢您的评论并为所有人提供帮助!