MySQL:如何使用左连接对行进行编号

MySQL:如何使用左连接对行进行编号,mysql,sql,Mysql,Sql,我的MySQL查询是为了一个报表,所以我想对每一行进行编号。换句话说,我想添加一个类似“rank”的字段,第一行是1,第二行是2,以此类推 我见过使用子查询和。从评论来看,这个方法似乎是正确的,但它不适用于我的特定查询。我相信这是因为我有几个JOINs,但我不确定。我可以让查询毫无错误地运行,但是当我完全按照上面文章中的指示添加行号时,“rank”列的顺序就不正确了 这是我的原始查询,没有添加等级: SELECT wsat_ib.user_id, wpjb_resume.id resume_id

我的MySQL查询是为了一个报表,所以我想对每一行进行编号。换句话说,我想添加一个类似“rank”的字段,第一行是1,第二行是2,以此类推

我见过使用子查询和。从评论来看,这个方法似乎是正确的,但它不适用于我的特定查询。我相信这是因为我有几个
JOIN
s,但我不确定。我可以让查询毫无错误地运行,但是当我完全按照上面文章中的指示添加行号时,“rank”列的顺序就不正确了

这是我的原始查询,没有添加等级:

SELECT wsat_ib.user_id, wpjb_resume.id resume_id, wpjb_resume.firstname, wpjb_resume.lastname, wsat_ib.overall_score, wsat_ib.account_score, wsat_ib.econ_score, wsat_ib.math_score, wsat_ib.logic_score, wsat_ib.fsanaly_score, wsat_ib.corpval_score, wsat_ib.end_time, GROUP_CONCAT(DISTINCT wp_usermeta.meta_value) AS target_employers, wpjb_field_value.value AS school, GROUP_CONCAT(wpjb_application.job_id) AS applications FROM  `wsat_ib` 
    LEFT JOIN wp_usermeta ON wsat_ib.user_id = wp_usermeta.user_id
    LEFT JOIN wpjb_resume ON wsat_ib.user_id = wpjb_resume.user_id
    LEFT JOIN wpjb_field_value ON wpjb_resume.id=wpjb_field_value.job_id AND wpjb_field_value.field_id=3
    LEFT JOIN wpjb_application ON wpjb_application.user_id = wsat_ib.user_id 
    WHERE (wp_usermeta.meta_key = 'target_employer' AND (wp_usermeta.meta_value = 'public' OR wp_usermeta.meta_value=2) AND wpjb_resume.is_active =1)
    GROUP BY wsat_ib.user_id, resume_id, wpjb_resume.firstname, wpjb_resume.lastname, wsat_ib.overall_score, wsat_ib.account_score, wsat_ib.econ_score, wsat_ib.math_score, wsat_ib.logic_score, wsat_ib.fsanaly_score, wsat_ib.corpval_score, wsat_ib.end_time, wpjb_field_value.value
     ORDER BY end_time DESC LIMIT 0, 20
以下是我添加排名字段的失败尝试:

SELECT @row := @row + 1 as row, wsat_ib.user_id, wpjb_resume.id resume_id, wpjb_resume.firstname, wpjb_resume.lastname, wsat_ib.overall_score, wsat_ib.account_score, wsat_ib.econ_score, wsat_ib.math_score, wsat_ib.logic_score, wsat_ib.fsanaly_score, wsat_ib.corpval_score, wsat_ib.end_time, GROUP_CONCAT(DISTINCT wp_usermeta.meta_value) AS target_employers, wpjb_field_value.value AS school, GROUP_CONCAT(wpjb_application.job_id) AS applications FROM (SELECT @row := 0) r, `wsat_ib` 
LEFT JOIN wp_usermeta ON wsat_ib.user_id = wp_usermeta.user_id
LEFT JOIN wpjb_resume ON wsat_ib.user_id = wpjb_resume.user_id
LEFT JOIN wpjb_field_value ON wpjb_resume.id=wpjb_field_value.job_id AND wpjb_field_value.field_id=3
LEFT JOIN wpjb_application ON wpjb_application.user_id = wsat_ib.user_id 
WHERE (wp_usermeta.meta_key = 'target_employer' AND (wp_usermeta.meta_value = 'public' OR wp_usermeta.meta_value=2) AND wpjb_resume.is_active =1)
GROUP BY wsat_ib.user_id, resume_id, wpjb_resume.firstnam[...]
查询运行时没有错误,但秩列不是1、2、3、4。。。而是:496498497499


我做错了什么?

因为SQL查询中有一个
GROUP BY
子句,所以您的行号不是您期望的那样。在分组前,将对每行的
SELECT
行进行评估

要解决您的问题,您可以使用嵌套查询,例如:

SELECT *, @row := @row + 1 AS row FROM (SELECT ...) AS t;
您提供的查询将是:

SELECT *, @row := @row + 1 AS row FROM (
    SELECT wsat_ib.user_id, wpjb_resume.id resume_id, wpjb_resume.firstname, wpjb_resume.lastname, wsat_ib.overall_score, wsat_ib.account_score, wsat_ib.econ_score, wsat_ib.math_score, wsat_ib.logic_score, wsat_ib.fsanaly_score, wsat_ib.corpval_score, wsat_ib.end_time, GROUP_CONCAT(DISTINCT wp_usermeta.meta_value) AS target_employers, wpjb_field_value.value AS school, GROUP_CONCAT(wpjb_application.job_id) AS applications FROM  `wsat_ib`
        LEFT JOIN wp_usermeta ON wsat_ib.user_id = wp_usermeta.user_id
        LEFT JOIN wpjb_resume ON wsat_ib.user_id = wpjb_resume.user_id
        LEFT JOIN wpjb_field_value ON wpjb_resume.id=wpjb_field_value.job_id AND wpjb_field_value.field_id=3
        LEFT JOIN wpjb_application ON wpjb_application.user_id = wsat_ib.user_id
        WHERE (wp_usermeta.meta_key = 'target_employer' AND (wp_usermeta.meta_value = 'public' OR wp_usermeta.meta_value=2) AND wpjb_resume.is_active =1)
        GROUP BY wsat_ib.user_id, resume_id, wpjb_resume.firstname, wpjb_resume.lastname, wsat_ib.overall_score, wsat_ib.account_score, wsat_ib.econ_score, wsat_ib.math_score, wsat_ib.logic_score, wsat_ib.fsanaly_score, wsat_ib.corpval_score, wsat_ib.end_time, wpjb_field_value.value
        ORDER BY end_time DESC LIMIT 0, 20) AS t
  CROSS JOIN
    (SELECT @row := 0) AS r 
ORDER BY end_time DESC ;

我认为您还需要在外部查询中添加
ORDER BY end_time DESC
。只是为了确保秩序得到维护。我明白了。这很有帮助。但我想知道。。。我开始尝试这样做的原因是出于性能方面的考虑,以避免在结果中循环并在之后分配排名编号。如果我的查询出现了几个子查询,您认为在MySQL中而不是在以后使用PHP进行查询仍然值得吗?我不认为这会在很大程度上改变查询性能。我认为,仅仅为了清晰起见,您最好使用PHP进行编号。在划掉“限制0,20”之后,这可能不起作用