【问题标题】:SQL Split comma separated list from one table and print content from second table based upon this listSQL 从一个表中拆分逗号分隔列表,并根据此列表从第二个表中打印内容
【发布时间】:2018-05-15 07:35:37
【问题描述】:

我有两张桌子,roomsutilities。 在名为rooms的表中,我有一个列也称为utilities。此列存储引用表 utilities 中的 ID 的逗号分隔数字。

如何拆分(分解?)utilities 列中的值,并将它们与utilities 表匹配,将具有匹配 ID 的值打印为吐出的值?

例子:

桌子:房间
|---------------|----------------|---------------- -|
| ID         | 姓名        | 实用程序     |
|---------------|----------------|---------------- -|
| 1       |房间 1      | 1,3,4      |
|---------------|----------------|---------------- -|

表:实用程序
|---------------|----------------|
| ID         | 设备      |
|---------------|----------------|
| 1           |扬声器|
|---------------|----------------|
| 2           |电视          |
|---------------|----------------|
| 3           |智能电视 |
|---------------|----------------|
| 4           |网络摄像头|
|---------------|----------------|

我想打印如下内容:
Room1: Speakers, Smart TV, Web camera

这是我目前所拥有的,confroomreport.php:

<?php
 require_once("db.php");
 $util = $conn->getDeviceList();
 $arr = $conn->getConfRoomList();
?>


<table border='1'>
    <tr>
        <th>Room</th>
        <th>Utilities</th>
    </tr>
    <?php for( $i=0; $i < count($arr); $i++) {
    print_r  ("<tr>
     <td>".$arr[$i]['name']."</td>
     <td>".$arr[$i]['utilities']."</td>
     </tr>"); } ?>
</table>

db.php

public function getDeviceList()
    {
          $arr = array();
          $statement = $this->conn->prepare("SELECT id, device from utilities order by device ASC");
          $statement->bind_result($id, $device);
          $statement->execute();
          while ($statement->fetch()) {
            $arr[] = [ "id" => $id, "device" => $device];
          }
          $statement->close();

          return $arr;
    }

public function getConfRoomList()
  {
      $arr = array();
      $statement = $this->conn->prepare("SELECT id, name, utilities from rooms order by name ASC");
      $statement->bind_result($id, $name, $utilities);
      $statement->execute();
      while ($statement->fetch()) {
      $arr[] = [ "id" => $id, "name" => $name, "utilities" => $utilities];
      }
      $statement->close();

      return $arr;
  }

根据接受的解决方案编辑更新的代码:

我将此添加到我的 db.php 中:

  public function joinDevRoom()
  {
     $arr = array();
     $statement = $this->conn->prepare("SELECT r.name,GROUP_CONCAT(u.device) FROM room r LEFT JOIN utilities u ON FIND_IN_SET(u.id,r.utilities)>0 GROUP BY r.id");
     $statement->bind_result($id, $utilities);
     $statement->execute();
     while ($statement->fetch()) {
       $arr[] = [ "id" => $id, "utilities" => $utilities];
     }
     $statement->close();

     return $arr;
  }

这是我更新的 confroomreport.php:

<?php
 require_once("db.php");
 $arr = $conn->getConfRoomList();
 $join = $conn->joinDevRoom();
?>


<table border='1'>
    <tr>
        <th>Room</th>
        <th>Utilities</th>
    </tr>
    <?php for( $i=0; $i < count($arr); $i++) {
     print_r  ("<tr>
     <td>".$arr[$i]['name']."</td>"); }
     for( $u=0; $u < count($join); $u++) {
     print_r ("<td>".$join[$u]['utilities']."</td>
     </tr>"); } ?>
    </table>

【问题讨论】:

  • 不要以 csv 格式存储值。了解规范化

标签: php mysql explode


【解决方案1】:

试试这个

SELECT r.Name,GROUP_CONCAT(u.Device) FROM rooms r
LEFT JOIN utilities u ON FIND_IN_SET(u.id,r.Utilities)>0
GROUP BY r.ID

【讨论】:

  • 谢谢,我根据这个解决方案更新了我的帖子。
猜你喜欢
  • 2014-05-27
  • 1970-01-01
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
  • 2014-06-17
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
相关资源
最近更新 更多