【问题标题】:MySQL Many to Many GroupingMySQL 多对多分组
【发布时间】:2011-03-12 03:00:22
【问题描述】:

我有以下具有这些属性的表格:

位置 - location_id、名称

时间表 - schedule_id,名称

locatoin_schedule - location_id、schedule_id

我正在使用这样的查询。

SELECT l.name as locationName, s.name as scheduleName
FROM location AS l, schedule AS s, location_schedule AS ls
WHERE ls.schedule_id = s.schedule_id
AND ls.location_id = l.location_id

这将返回一个如下所示的数组:

Array
(
    [0] => stdClass Object
        (
            [locationName] => testing
            [scheduleName] => New Schedule
        )

    [1] => stdClass Object
        (
            [locationName] => another
            [scheduleName] => New Schedule
        )

    [2] => stdClass Object
        (
            [locationName] => testing
            [scheduleName] => Another Schedule
        )

)

如果一个位置有很多时间表(如testing 位置的情况),是否可以返回一个多维时间表数组?所以我的预期结果将是一个只有 2 个索引的数组,而不是 3 个......但是测试 locationName 将包含一个有两个时间表的数组。

我希望这是有道理的,谢谢你的回答。

【问题讨论】:

  • 这取决于查询结果如何被拉入 PHP。 MySQL 不会直接将任何内容返回到 php 数组中 - 它会返回列和行的网格结果,并且您的 PHP 代码会将其放入您说明的数组中。发布该代码。 (即 mysql_fetch_object() 等)
  • codeigniter.com/user_guide/database/examples.html - 我正在使用 codeigniter,代码是 $query = $this->db->query('SELECT name, title, email FROM my_table');所以它只返回从 mysql 返回的行并将其转换为数组

标签: php mysql sql


【解决方案1】:

您要么将当前查询处理为所需的数据结构,要么使用 GROUP_CONCAT,然后将调度字符串拆分为所需的结构。我会坚持第一个,因为它更干净,查询也更快。

$q="
SELECT l.name as locationName, s.name as scheduleName 
FROM location AS l JOIN schedule AS s ON ls.schedule_id = s.schedule_id 
 JOIN location_schedule AS ls
  ON ls.location_id = l.location_id";
$r=$db->query($q)
while($arr=$r->fetch_assoc()){
  $data[$arr['locationName']][]=$arr['scheduleName'];
}

或 GROUP_CONCAT 选项:

$q="
SELECT l.name as locationName, GROUP_CONCAT(s.name) as scheduleName 
FROM location AS l JOIN schedule AS s ON ls.schedule_id = s.schedule_id 
 JOIN location_schedule AS ls
  ON ls.location_id = l.location_id
GROUP BY locationName";
$r=$db->query($q)
while($arr=$r->fetch_assoc()){
  $schedules=explode($arr['scheduleName']);
  $data[$arr['locationName']]=$schedules
}

【讨论】:

    猜你喜欢
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多