首页 > 解决方案 > Mysql/PHP - 在 php 中显示 group_concat 值

问题描述

在我目前正在完成的一个小项目中,我在 Mysql 数据库中有三个表。

一张表(主表)包含有关比赛名称、运动等的信息。

另一个表(频道)包含频道信息,例如名称和链接。

最终表(多通道)包含两个外键,它们链接到其他表字段(来自通道表的 channelid)和(来自主表的 eventid)。

比赛/事件和频道之间的关系是一场比赛可以在许多频道上。

为了清楚起见,下面是我在数据库中设置的表的导出。

-- Adminer 4.7.5 MySQL dump

SET NAMES utf8;
SET time_zone = '+00:00';
SET foreign_key_checks = 0;
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';

DROP TABLE IF EXISTS `channels`;
CREATE TABLE `channels` (
  `channelid` int(2) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `link` varchar(100) NOT NULL,
  PRIMARY KEY (`channelid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `channels` (`channelid`, `name`, `link`) VALUES
(1, 'Turkmenistan Sport',   'turkmensport.php'),
(2, 'Sportitalia',  'sportitalia.php'),
(3, 'CBC Sport',    'cbcsport.php'),
(4, 'TVM1', 'tvm1.php');

DROP TABLE IF EXISTS `main`;
CREATE TABLE `main` (
  `eventid` int(3) NOT NULL,
  `event` varchar(150) NOT NULL,
  `date` varchar(10) NOT NULL,
  `time` varchar(5) NOT NULL,
  `sport` varchar(25) NOT NULL,
  `league` varchar(25) NOT NULL,
  KEY `eventid` (`eventid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `main` (`eventid`, `event`, `date`, `time`, `sport`, `league`) VALUES
(1, 'Blackburn vs Leeds',   '20/01/2020',   '15:00',    'Football', 'English Championship'),
(2, 'Blackburn vs Aston Villa', '21/01/2020',   '15:00',    'Football', 'FA Cup'),
(3, 'Blackburn vs Wolves',  '22/01/2020',   '15:00',    'Football', 'FA Cup');

DROP TABLE IF EXISTS `multichannels`;
CREATE TABLE `multichannels` (
  `eventid` int(3) NOT NULL,
  `channelid` int(3) NOT NULL,
  KEY `channelid` (`channelid`),
  KEY `eventid` (`eventid`),
  CONSTRAINT `multichannels_ibfk_2` FOREIGN KEY (`channelid`) REFERENCES `channels` (`channelid`),
  CONSTRAINT `multichannels_ibfk_3` FOREIGN KEY (`eventid`) REFERENCES `main` (`eventid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `multichannels` (`eventid`, `channelid`) VALUES
(1, 1),
(1, 2);

-- 2020-01-19 01:26:30

我的目标是能够通过多通道表中的两个或多个链接在 php 中回显一个匹配/事件详细信息。因此,我的目标是针对两个通道名称(基于多通道表中的通道标识回显),而不是为相同的匹配设置两个单独的条目,唯一的区别是链接字段。

为此,我尝试了下面的 group_concat 查询:

SELECT GROUP_CONCAT(multichannels.channelid)
    FROM multichannels
    INNER JOIN main ON multichannels.eventid=main.eventid 
    INNER JOIN channels ON multichannels.channelid=channels.channelid
    GROUP BY event, time, sport;

运行此查询会输出特定 eventid 的两个 channelid。

我遇到的问题是如何将每个频道的名称作为 php 中的链接回显?

我研究过可以使用explode功能,但我不确定如何获取要显示的通道名称才能使用此功能。

我当前的 php 代码是

$query = "SELECT f.event, f.date, f.time, f.sport, f.league, x.name, x.link
    FROM main f
LEFT JOIN channels x
ON x.channelid=f.channelid
GROUP BY f.event, f.date, f.time, f.sport, f.league, x.channelid, x.name, x.link";

 $stmt = $DBcon->prepare($query);

  $stmt->execute();
?>


<thead>
   <tr>
        <th>Match/Event</th>
        <th>Date </th>
        <th>Time (GMT)</th>
        <th>Sport</th>
   <th> Link</th>

</tr>
</thead>


<?php

        while ($row = $stmt->fetch(PDO::FETCH_ASSOC))
  {

$match= $row['event'];
    $sport= $row['sport'];
    $date= $row['date'];
    $time= $row['time'];
        $link= $row['link'];
        $channelid= $row['channelid'];
        $name=$row['name'];

            ?>

            <tbody>
        <tr>
       <td data-label="Match/Event" style="font-weight:bold;"><?php echo $row["event"]; ?></td>
       <td data-label="Date"><?php echo $row["date"]; ?></td>
       <td data-label="Time (GMT)"><?php echo $row["time"]; ?></td>
    <td data-label="Sport"><?php echo $row["sport"]; ?></td>
        <td data-label="Link"><a href="https://gbcltd.club/fta/channels/<?php echo $row["link"];?>">  <?php echo $row["name"]; ?></a></td>
</tr>
                    <?php
      }
   ?>

提前感谢任何人都可以提供的任何指导。

标签: phpmysql

解决方案


推荐阅读