PHP 结果与 MYSQL 多对多表和 GROUP By

标签 php mysql many-to-many

我正在整理一份服务提供商列表。我希望将它们列出如下:

水管工: 乔的水管 迈克的管道

电工: 斯科特电气 约翰电气

等等...

如何从我的查询中提取并分组这些信息。另外,当我尝试调用 pt.name 时,它​​说它是 NULL,有什么想法吗?

谢谢

$qry  = "SELECT pt.name, p.name, p.phone
FROM provider_type AS pt
LEFT JOIN providers_provider_type AS ppt ON pt.id = ppt.provider_type_id
LEFT JOIN providers AS p ON ppt.providers_id = p.id
WHERE installation_id = $installation_id
GROUP BY ppt.provider_type_id";
//$qry = "SELECT * FROM providers WHERE installation_id = $installation_id";    
$res = mysqli_query($mysqli, $qry) or die('-1'.mysqli_error($mysqli));


    $categories = array();
    while ($row_rsCategories = mysqli_fetch_assoc($res)) { 


/////////////////////////////////////////////// 

        $categories[] = array(
            'id' => $row_rsCategories['id'],
            'provider_type' => $row_rsCategories['pt.name'],
            'provider_name' => $row_rsCategories['name']
        );

    }


?>


<div class="container">
    <div class="content">
        <?php if ($msgBox) { echo $msgBox; } ?>
        <div class="row">  
<?php var_dump($categories); ?>

<?php if (empty($categories)) { ?>
    <div class = "big-icon">
        <i class="fa fa-meh-o fa-5x"></i>
    </div>
    <p><center>Sorry! It looks like we don't have a Scout in this area. <br />
        Please check back in as we continue to add new Scouts to the network all the time.</center></p>

<?php  } else {
?>

<table class="table table-striped">
<tr>
    <th>Type</th>
    <th>Name</th>
    <th>Phone</th>
    <th>More Info</th>
</tr>

<?php foreach ($categories as $category) { ?>
<tr>
    <td><?php echo $category['provider_type']; ?>  </td>
    <td><?php echo $category['provider_name']; ?> </td>
    <td> </td>
    <td> </td>
</tr>   

    <?php  } 
        }
        ?>  
</table>    

最佳答案

您的查询对于每种提供程序类型仅返回一行,而您想要列出所有提供程序(每种类型多个提供程序)。

一种选择是使用 GROUP_CONCAT,它将每种类型的所有提供程序连接成一个逗号分隔的字符串:

SELECT pt.name AS type, GROUP_CONCAT(p.name) AS providers
FROM provider_type AS pt
LEFT JOIN providers_provider_type AS ppt ON pt.id = ppt.provider_type_id
LEFT JOIN providers AS p ON ppt.providers_id = p.id
WHERE installation_id = $installation_id
GROUP BY ppt.provider_type_id;

这将为您提供一个如下所示的结果集:

type        | providers                       |
------------+---------------------------------+
plumber     | Joe's Plumbing,Mike's Plumbing  |
electrician | Scott electric,John electric    |

就你的情况而言,我认为有一个更好的选择 - 因为无论如何你都将所有结果检索到 php 中,所以你可能想要一一获取所有提供者,然后在代码中进行分组,并显示它任何你喜欢的方式。

查询将与您的查询相同,但没有分组:

SELECT pt.name AS type, p.name, p.phone
FROM provider_type AS pt
LEFT JOIN providers_provider_type AS ppt ON pt.id = ppt.provider_type_id
LEFT JOIN providers AS p ON ppt.providers_id = p.id
WHERE installation_id = $installation_id;

结果集只是一个提供商列表,每个提供商都有他的姓名和电话号码。

type        | name            | phone         |
------------+-----------------+---------------+
plumber     | Joe's Plumbing  | 123...        |
plumber     | Mike's Plumbing | 123...        |
electrician | Scott electric  | 123...        |
electrician | John electric   | 123...        |

至于pt.name中的NULL - 在 MySQL 的结果集中,您不会得到 pt.namep.name 作为列名称。您将得到 namename1 (两列具有相同的名称,无论它们最初来自哪个表,因此数据库只需添加 1 即可获得唯一的名称)。

您应该为查询中的列指定唯一的名称,例如pt.name AS type 然后使用这些名称来读取数据,例如'provider_type' => $row_rsCategories['type']

关于PHP 结果与 MYSQL 多对多表和 GROUP By,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28506790/

相关文章:

sql - 使用 GroupBy 从多对多中选择

php - 追踪 CakePHP 中的错误函数调用

php - 如何修改 WooCommerce 中的商店页面主查询以显示列表中每个产品的变体?

php - 如何选择行数乘以非零列? (mysql)

PHP + MySQL : Return function only show last result

python - 创建对象时防止 m2m_changed 触发

mysql - 在数据库中表示多对多关系的最佳方式是什么?

mysql - 如何生成此 mysql 查询

mysql - ODBC连接错误:No such command "odbc show" ODBC connection fail in asterisk*CLI

javascript - mysql查询中的日期格式添加额外的小时