有没有办法让其他数据集中已知相同的值为空?
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)
在这种情况下,由于product
与INNER JOIN
,product_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}}
这将大大降低内存利用率,尤其是在对大型数据集进行分组时。
答案 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;
后两者应该比第一种解决方案更多地减少空间。