你能试试吗(这个例子使用MySQL 用户定义的变量,对于这个查询,MySQL 知道使用子查询之外的值进行比较很重要)
SELECT _atc_codes.se, _atc_codes.code,
@code_substr:=SUBSTR(_atc_codes.code, 1, 1) AS code_substr,
(
SELECT se
FROM _atc_codes
WHERE code=@code_substr
LIMIT 1
) AS code_substr_se
FROM diagnoses
JOIN _atc_codes ON _atc_codes.id = diagnoses.atc_code
或者(此示例将表别名分配给子查询中使用的外部表,因为您使用了两次表并且 MySQL 不知道SUBSTR
在子查询中引用哪个表):
SELECT outer_codes .se, outer_codes .code,
SUBSTR(outer_codes .code, 1, 1) AS code_substr,
(
SELECT se
FROM _atc_codes
WHERE code=SUBSTR(outer_codes.code, 1, 1)
LIMIT 1
) AS code_substr_se
FROM diagnoses
JOIN _atc_codes AS outer_codes ON outer_codes.id = diagnoses.atc_code
第三种方法是添加第二个JOIN
然后对结果集进行分组,例如
SELECT _atc_codes_1st.se, _atc_codes_1st.code,
SUBSTR(_atc_codes_1st.code, 1, 1) AS code_substr,
MAX(_atc_codes_2nd.se) AS code_substr_se
FROM diagnoses
JOIN _atc_codes AS _atc_codes_1st ON _atc_codes_1st.id = diagnoses.atc_code
JOIN _atc_codes AS _atc_codes_2nd ON _atc_codes_2nd.code = SUBSTR(_atc_codes_1st.code, 1, 1)
GROUP BY _atc_codes_1st.se, _atc_codes_1st.code,code_substr
决定使用哪个变体,最好在EXPLAIN
查询中添加一个以显示执行计划。祝你好运。