按行显示分组和显示,以及在其下方的其他表中包含其ID的行

时间:2011-10-05 03:56:34

标签: mysql sql join group-by

假设我有2张桌子

在第一个表格中,我有以下字段:

STRUCTURE for `FRUITS`

`id` - int
`name` - varchar

ROWS in `FRUITS`

1 | apples
2 | grapes

在第二张表中,我有:

STRUCTURE for `COLORS`

`id` - int
`id_fruit` - int
`name` - varchar

ROWS in `COLORS`

1 | 1 | red
2 | 1 | green
3 | 1 | yellow
4 | 2 | purple
5 | 2 | green

在单个查询中,我希望它输出如下结果:

APPLES (#1)

- red (#1)
- green (#2)
- yellow (#3)

GRAPES (#2)

- purple (#4)
- green (#5)

基本上我只是在1个表中按行分组,然后从另一个表中输出所有行,并按行分组ID。

2 个答案:

答案 0 :(得分:1)

这样的事情可能会:

SELECT
  `name`
FROM (
  SELECT
    `id_fruit`,
    `id` AS `id_color`,
    CONCAT('- ', `name`) AS `name`
  FROM `COLORS`
  UNION ALL
  SELECT
    `id`,
    0,
    `name`
  FROM `FRUITS`
) s
ORDER BY
  `id_fruit`,
  `id_color`

水果名称和颜色名称组合在一起。颜色名称的`id`值为`id_color`,水果名称的虚拟`id_color`值为0。这样,当按`id_fruit`, `id_color`排序时,水果总是出现在各自的颜色之前。此外,在颜色名称之前附加了“项目符号”('- ')。

答案 1 :(得分:0)

Select f.id,f.name, group_concat(c.name SEPARATOR ',') as colors from FRUITS f LEFT JOIN COLORS c on f.id=c.id_fruit group by f.id;

然后

$colors = explode(',', $row->colors);