这将很难解释,但我会尽力而不会让你们大吃一惊。我有以下表格设计;
这是我的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信息然后另一个查询将服务返回到一个数组中,然后在页面上运行它们?
答案 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)
GROUP_CONCAT()仅在行数有限(10-100)时使用,如果数据较大则会大大减慢查询速度。
2个查询(一个用于数据类型1)
保留此查询并修改结果(我最喜欢的方式)。 在服务器或JS循环中通过您的数据并重新构建它(添加1个额外的维度)
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'];
}