繁体   English   中英

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

[英]How to display a MySQL Many to Many Relationship with PHP

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

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

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

任何帮助,将不胜感激

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

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

数据库架构

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

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

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

再次感谢您的评论并为大家提供帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM