gpt4 book ai didi

mysql - 如何将重复列数据设为NULL?

转载 作者:行者123 更新时间:2023-11-30 01:30:35 25 4
gpt4 key购买 nike

有没有办法将数据集中其余部分已知相同的值设为 NULL?

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)

在本例中,由于 INNER JOINproduct_property 的关系,product 被多次返回。我只需要每个产品的第一行即可对结果进行分组。

因此,所需的输出:

+----+------+-----------------------+-----------------------+
| 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 |
+----+------+-----------------------+-----------------------+

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

最佳答案

您可以使用变量做您想做的事情:

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;

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

关于mysql - 如何将重复列数据设为NULL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17517288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com