我可以使用哪些替代方法而不是GROUP_CONCAT

时间:2017-07-11 11:50:30

标签: mysql

我有一个MySQL查询如下

SELECT
substances.id,
substances.`name`,
GROUP_CONCAT(DISTINCT(cas.`value`) SEPARATOR "<br>") AS cas_number,
GROUP_CONCAT(DISTINCT(ecs.`value`) SEPARATOR "<br>") AS ec_number
FROM
substances
LEFT JOIN ecs_substances
ON substances.id = ecs_substances.substance_id 
LEFT JOIN ecs
ON ecs_substances.ec_id = ecs.id 
LEFT JOIN cas_substances
ON cas_substances.substance_id = substances.id 
LEFT JOIN cas
ON cas_substances.cas_id = cas.id

这是一个化学物质表(substances),其中包含大约250,000行。

然后引用这些物质的EC(ec.value)和CAS(cas.value)数字(这些是化学术语)的表格。还有一些表格用作参考,说明哪些物质分别属于哪个EC和CAS编号ec_substancescas_substances

我遇到的问题是一种物质可能有多个EC和CAS号。我通过将每个物质分成1行,然后提供EC和CAS编号的单独列表来处理这个问题 - 分隔符是<br>,因为它是在PHP Web应用程序中输出的。

查询速度很慢,我相信这是因为使用了GROUP_CONCAT

以下查询运行速度提高了约15倍。但是,这会将EC和CAS编号放在各自的行上;所以物质行(substance.idsubstance.name)是重复的,其中存在该物质的多个EC和CAS。

SELECT
substances.id,
substances.`name`,
ecs.`value` AS ec_number,
cas.`value` AS cas_number
FROM
ecs_substances
JOIN substances
ON ecs_substances.substance_id = substances.id 
JOIN ecs
ON ecs_substances.ec_id = ecs.id 
JOIN cas_substances
ON cas_substances.substance_id = substances.id 
JOIN cas
ON cas_substances.cas_id = cas.id

是否有任何“中间地带”选项仍会在一行中提供EC和CAS编号,但没有使用GROUP_CONCAT的开销?

应用程序在PHP中运行,但理想情况下我想要一个仅限MySQL的解决方案,因为我相信以这种方式获得结果比在PHP中处理它们更快。

任何提示或建议都将不胜感激。

0 个答案:

没有答案