net*_*djw -1 php mysql perl join
我在MySQL中有这个数据结构:
+-----------+-----------+--------------+
| name | barcode | factory_code |
+-----------+-----------+--------------+
| product 1 | 123456789 | |
| product 2 | 987654321 | |
| product 3 | | AAAAAAAAAAAA |
| product 4 | | BBBBBBBBBBBB |
| product 5 | 111111111 | CCCCCCCCCCCC |
+-----------+-----------+--------------+
Run Code Online (Sandbox Code Playgroud)
现在我需要生成此结果并以HTML格式显示:
+-----------+-------------------------+
| name | code |
+-----------+-------------------------+
| product 1 | 123456789 |
| product 2 | 987654321 |
| product 3 | AAAAAAAAAAAA |
| product 4 | BBBBBBBBBBBB |
| product 5 | 111111111, CCCCCCCCCCCC |
+-----------+-------------------------+
Run Code Online (Sandbox Code Playgroud)
字段不是NULL,只是空的.
我认为我直接用MySQL查询生成这个,编码更少,也许它会更快地工作.我可以使用PHP的/ Perl join函数来完成它.
有可能直接在MySQL中做吗?
你可以concat_ws()在MySQL中使用.由于您没有NULL空字符串,因此您需要实现一些逻辑来过滤掉这些空字段.
SELECT
name,
concat_ws(
', ',
IF(barcode > "", barcode, NULL),
IF(factory_code > "", factory_code, NULL)
) as 'code'
FROM Table1;
Run Code Online (Sandbox Code Playgroud)
正如Borodin在他的评论中指出的那样,如果barcode包含空格或控制字符,则它将不等于空字符串,因此barcode = ""将失败,结果将是一个虚假的逗号.但MySQL空间扩展了比较的两个参数,因此任何包含非空格字符的内容都将"大于"任何不包含非空格字符的内容.IF (barcode > "", barcode, NULL)转向NULL任何只是控制字符(HT,LF,CR等)或空格的东西.
在这里试试吧.
但是,它不会让你更快地让数据库做到这一点.对于这个相当少量的数据,它可以忽略不计,我认为它甚至不值得考虑.
在Perl中,您还必须添加空字符串的检查.
while (my $res = $sth->fetchrow_arrayref) {
my $name = shift @$res;
my $code = join ', ', grep { $_ } @$res;
# and then do stuff
}
Run Code Online (Sandbox Code Playgroud)
该grep { $_ } @$res过滤掉不被认为是所有值的真正价值.也就是说,空字符串以及NULL值表示的值undef.
从维护的角度来看(如果这很重要),在应用程序而不是SQL中执行它是首选1.如果它是一次性代码,我个人会选择那个让我思考最少的代码.
1)也就是说,如果我们在谈论在一个小应用程序内混合的纯SQL.在更大的范围内,如果有实际的模型层,我会将聚合移动到该模型中.
| 归档时间: |
|
| 查看次数: |
65 次 |
| 最近记录: |