显示多表mysql查询

时间:2013-02-28 15:12:21

标签: php mysql sql

这将很难解释,但我会尽力而不会让你们大吃一惊。我有以下表格设计;

Mysql Table

这是我的mysqlFiddle来演示问题:http://sqlfiddle.com/#!2/1363c/1

正如您所看到的,这些表工作正常,查询显示了什么样的服务器具有哪些服务,但当我尝试在我的网站上显示此信息时,问题出现了。我目前正在使用以下代码;

<?php
    echo '<p>', "<strong>Shelter id</strong>: " . $query['shelter_id'].'</p>';
    echo '<p>', "<strong>Shelter name</strong>: " . $query['shelter_name'].'</p>';
    echo '<p>', "<strong>Street</strong>: " . $query['street'].'</p>';     
    echo '<p>', "<strong>City</strong>: " . $query['city'].'</p>';    
    echo '<p>', "<strong>Postcode</strong>: " . $query['postcode'].'</p>';  
    echo '<p>', "<strong>Contact Number</strong>: " . $query['phone_number'].'</p>';  
    echo '<p>', "<strong>Location</strong> :  " . $query['location_name'].'</p>'; 
?>

但是对于我正在使用的查询,它不会将所有信息变成一行,它会为service_name创建多行,我认为。

我是否有可能创建一个查询,该查询将返回该行可以在一行上执行的所有服务?

编辑:我是否必须进行2次单独的查询?一个获取通用的shelter信息然后另一个查询将服务返回到一个数组中,然后在页面上运行它们?

2 个答案:

答案 0 :(得分:1)

如何使用GROUP_CONCAT?它的作用是将值组合成逗号分隔值。您可以稍后在Explode()中使用PHP

SELECT  shelter_name, 
        GROUP_CONCAT(services.service_name)  service_name
FROM    shelter
        INNER JOIN shelter_service 
          ON shelter.shelter_id= shelter_service.shelter_id
        INNER JOIN services 
          ON shelter_service.service_id = services.service_id
GROUP   BY shelter.shelter_id, shelter_name
ORDER   BY shelter_name

答案 1 :(得分:1)

  1. GROUP_CONCAT()仅在行数有限(10-100)时使用,如果数据较大则会大大减慢查询速度。

  2. 2个查询(一个用于数据类型1)

  3. 保留此查询并修改结果(我最喜欢的方式)。 在服务器或JS循环中通过您的数据并重新构建它(添加1个额外的维度)

  4. var new_data = {};
    for(var i in data)//data is your $query
    {
      var row = data[i];
      //create another layer of the array (make it in 2 dimensions)
      if (typeof(new_data[row['Service_name']) == 'undefined)
         new_data['Service_name'] = [];
       //add only this kind of type data
         new_data['Service_name'].push(data);
     }
    //now you can remove the data and use new_data
    

    0.4。确保查询主要按服务名称排序,当您循环显示(回显)时,显示当前服务名称。

    $current_name = '';
    for(...)
     //if we passed to a new service in the loop
    if ($query['service_name'] != $current_name) {
       echo '<h3>'.$query['service_name'].'</h3>;//display the new service
        $current_name = $query['service_name'];
    }