我一直在在mysql数据库中的一个表上工作,该表被本地保存在wamp服务器上,我正在wamp中使用phpmyadmin区域来运行查询。我正在尝试获取数据来执行以下操作:
任何人都可以帮我建立一张带有许多工厂记录的表格。植物可以具有多个名称,该表将其显示为不同的记录。该表称为new_plantsname
plantid name
1 tree
1 rose
2 bush
3 tree
3 bush
3 rose
持续超过3000条记录
我想要的是将具有相同plantid的记录组合在一起,并在不同的列中显示不同的名称:
plantid name1 name2 name3 ...
1 tree rose NULL
2 shrub NULL NULL
3 tree rose bush
等等
乍一看,我相信一家工厂的名称不超过4个。
可以帮我查询做到这一点。我也想将结果保存到新表中
有人给了我以下答案:
select plantid,
max(case when nameRn = 'name1' then name end) Name1,
max(case when nameRn = 'name2' then name end) Name2,
max(case when nameRn = 'name3' then name end) Name3,
max(case when nameRn = 'name4' then name end) Name4
from
(
select plantid, name,
concat('name', @num := if(@plantid = `plantid`, @num + 1, 1)) as nameRn,
@plantid := `plantid` as dummy
from
(
select plantid, name, @rn:=@rn+1 overall_row_num
from yourtable, (SELECT @rn:=0) r
) x
order by plantid, overall_row_num
) src
group by plantid;
这似乎可以正常工作,但没有错误,但是它没有合并记录,只保留了第一个记录的名称,而没有保留其他记录。使用的数据:
plantid name
1 tree
1 rose
2 tree
3 rose
3 bush
3 rose
结果:
谁能帮忙
问题是MySQL没有枚举行的好方法。根据MySQL文档,常量的使用不能保证正常工作。它通常可以工作,但是也可能会出现问题。
我建议您将这些名称连接到一个字段中。结果如下所示:
1 tree,rose
2 tree
3 tree,bush,rose
使用SQL:
select plantid, group_concat(name separator ',')
from t
group by plantid
如果您确实希望在单独的列中使用名称,则可以想到两个选项。一种是使用上面的结果,然后将结果解析为单独的字符串。另一种选择是使用自连接和聚合来计算序列号,如下所示:
select p.plantid, p.name, count(*) as seqnum
from t p left outer join
t pprev
on p.plantid = pprev.plantid and
p.name >= pprev.name
group by p.plantid, p.name
并将其用作子查询。
问题内容: 我有一张表,上面有一些植物的记录。植物可以具有多个名称,该表将其显示为不同的记录。该表称为new_plantsname 这继续超过3000条记录 我想要的是将具有相同Plantid的记录组合在一起,并在不同的列中显示不同的名称: 等等 我也想将结果保存到新表中 问题答案: 基本上,这是一个(您未指定RDBMS)我假设MySQL并且它没有函数,因此您将需要使用带有语句的聚合函数来复制它。
问题内容: 我正在尝试将具有相同ID但具有不同列值的不同行合并为一个。 例如 : 我希望将其结合起来,这样结果是: 或者 或上述内容的任何其他变体,以使行以某种方式连接在一起。 任何帮助,将不胜感激!提前致谢。 问题答案: 请先阅读我的评论-除非仅用于报告目的,否则您甚至都不要考虑这样做,并且您想了解如何在普通SQL中做到这一点(而不是使用报告的正确解决方案)工具)。 第二种格式最简单,特别是如果
问题内容: 很抱歉,我只学习了PHP和MySQL,已经搜索了一个多星期,但是没有找到任何答案。 我创建了一个简单的财务脚本,该表如下所示: 我想要这样的结果 有人可以帮助我解决我的问题吗? 谢谢 问题答案: 正如@Quassnoi指出的那样,这对于MySQL来说不是很有效。我尝试使用怪胎连接而不是子查询,因为内部查询本身就可以使用。 编辑 对此引起了一些兴趣,发现连接版本的速度是@Quassnoi
问题内容: 考虑这样的一张桌子 问题是,如果我给定值2和5,我应该得到102和105,而102和105都同时具有值2和5,或者如果我给定值1和3,我应该得到100和104。 我如何仅用一个sql命令就能做到这一点?我需要一个尽可能轻的查询。 并使用UNION,INTERSECTION或NESTED SQL,哪个更快,更慢,更重? 在此先感谢Ergec 问题答案: 有很多解决方案。除了Jhonn
问题内容: 我遇到一个问题,当执行两个表的联接时,无法确定mysql查找具有两个特定“标签”和相同“ hashid”的链接 假设我的表看起来像这样: 链接 标签 我想返回同时具有“有用”和“很棒”标签的行 当前(工作/快速)查询,用于按1个标签查找链接: 阅读文章后,我尝试使用以下内容: 这 不 工作,但它是如此令人难以置信的缓慢,因为无法使用。 有人知道解决方案吗? 问题答案: 问题的类型称为
问题内容: 我如何结合这两个更新语句: 问题答案: 您可以使用CASE表达式,如下所示: