如何使重复列数据为空?

时间:2013-07-07 23:08:09

标签: mysql pdo

有没有办法让其他数据集中已知相同的值为空?

mysql> SELECT
    -> `p1`.`id`,
    -> `p1`.`name`,
    -> `pp1`.`name` `product_property_name`,
    -> `pp1`.`value` `product_property_name`
    -> FROM
    -> `product` `p1`
    -> INNER JOIN
    -> `product_property` `pp1`
    -> ON
    -> `p1`.`id` = `pp1`.`product_id`;
+----+------+-----------------------+-----------------------+
| id | name | product_property_name | product_property_name |
+----+------+-----------------------+-----------------------+
|  1 | Tar  | foo                   | bar                   |
|  1 | Tar  | foo1                  | bar1                  |
|  1 | Tar  | foo2                  | bar2                  |
|  2 | Qaz  | too                   | doo                   |
|  2 | Qaz  | too1                  | doo1                  |
+----+------+-----------------------+-----------------------+
5 rows in set (0.00 sec)

在这种情况下,由于productINNER JOINproduct_property会多次返回+----+------+-----------------------+-----------------------+ | id | name | product_property_name | product_property_name | +----+------+-----------------------+-----------------------+ | 1 | Tar | foo | bar | | 1 | NULL | foo1 | bar1 | | 1 | NULL | foo2 | bar2 | | 2 | Qaz | too | doo | | 2 | NULL | too1 | doo1 | +----+------+-----------------------+-----------------------+ 。我只需要每个产品的第一行来对结果进行分组。

因此,所需的输出:

{{1}}

这将大大降低内存利用率,尤其是在对大型数据集进行分组时。

1 个答案:

答案 0 :(得分:0)

你可以使用变量做你想做的事:

SELECT `p1`.`id`,
       (case when name <> @prevname then `p1`.`name` end) as name,
       `pp1`.`name` as `product_property_name`,
       `pp1`.`value` as `product_property_name`,
       @prevname := name
FROM `product` `p1` INNER JOIN
     `product_property` `pp1` cross join
     (select @prevname := '') const
     ON `p1`.`id` = `pp1`.`product_id`;

虽然这在实践中有效,但不保证可以正常工作,因为MySQL不保证select语句中列的评估顺序(因此理论上@prevname := name可能首先发生)

但是,您可以考虑使用group_concat()代替,并为每个属性分配多行:

SELECT `p1`.`id`,
       `p1`.`name`,
       group_concat(pp1.name, ', ') as product_property_names,
       group_concat(pp1.value, ', ') as product_property_values
FROM `product` `p1` INNER JOIN
     `product_property` `pp1`
     ON `p1`.`id` = `pp1`.`product_id`
group by p1.id, p1.name;

或者,作为一对:

SELECT `p1`.`id`,
       `p1`.`name`,
       group_concat(concat(pp1.name, '=', pp1.value), '; ') as product_property_pairs
FROM `product` `p1` INNER JOIN
     `product_property` `pp1`
     ON `p1`.`id` = `pp1`.`product_id`
group by p1.id, p1.name;

后两者应该比第一种解决方案更多地减少空间。