2

我有许多表,我试图在一个查询中从其中的许多表中提取数据。我已经研究出如何成功地LEFT JOIN从其他表中提取相关数据,并使用一个通用 ID。

通过这个查询,我试图为我们的 ASSOCIATES_BACKGROUND_DATA 表中的每个联系人获取数据。

首先,我试图找到他们最近的会议ASSOCIATES_1_TO_1S.DATE_OF_MEETING(这是存储为时间戳,所以只寻找最大的时间戳) - 我没有得到正确的结果,我MAX是否正确使用了该函数?

其次,我想获取所有ASSOCIATES_ACTION_STEPS记录ASSOCIATE_ID。正确的加入似乎也没有把它拉进来?

任何人都可以帮忙吗?感觉我已经很接近得到这个结果了,但这真的让我很烦!

SELECT *, 
        ASSOCIATES_BACKGROUND_DATA.ASSOCIATE_ID as ABG_ASSOCIATE_ID,
            ASSOCIATES_BACKGROUND_DATA.NAME_KNOWN_AS as ABG_NAME_KNOWN_AS, 
        ASSOCIATES_BACKGROUND_DATA.LAST_NAME as ABG_LAST_NAME, 
        USERS.NAME_KNOWN_AS as USERS_NAME_KNOWN_AS, 
        USERS.LAST_NAME as USERS_LAST_NAME, 
        MAX(ASSOCIATES_1_TO_1S.DATE_OF_MEETING)
    FROM ASSOCIATES_BACKGROUND_DATA
 LEFT JOIN ASSOCIATES_1_TO_1S
        ON ASSOCIATES_BACKGROUND_DATA.ASSOCIATE_ID = ASSOCIATES_1_TO_1S.ASSOCIATE_ID
 LEFT JOIN LIST_OF_UNIVERSITIES
        ON ASSOCIATES_BACKGROUND_DATA.UNIVERSITY = LIST_OF_UNIVERSITIES.ID
 LEFT JOIN USERS
        ON ASSOCIATES_BACKGROUND_DATA.PROGRAMME_COORDINATOR = USERS.ID
 RIGHT JOIN ASSOCIATES_ACTION_STEPS
        ON ASSOCIATES_BACKGROUND_DATA.ASSOCIATE_ID = ASSOCIATES_ACTION_STEPS.ASSOCIATE_ID
  GROUP BY ASSOCIATES_1_TO_1S.ASSOCIATE_ID
  ORDER BY `ABG_NAME_KNOWN_AS` ASC

非常感谢您提供的任何帮助或指示...

4

1 回答 1

3

我检查了你的查询。对我来说,第一步是重新格式化它以使其更具可读性(如果您花时间在查询上,则非常重要,您不需要任何类型的开销)。

之后,我回顾了逻辑,得出了两个结论:

  • 你不需要正确的加入
  • 您的分组算法不太正确。

请查看此查询并告诉我是否缺少某些内容:

SELECT 
    abg.ASSOCIATE_ID as ABG_ASSOCIATE_ID,
    abg.NAME_KNOWN_AS as ABG_NAME_KNOWN_AS, 
    abg.LAST_NAME as ABG_LAST_NAME, 
    u.NAME_KNOWN_AS as USERS_NAME_KNOWN_AS, 
    u.LAST_NAME as USERS_LAST_NAME, 
    t.lastmeeting
FROM ASSOCIATES_BACKGROUND_DATA abg 
        LEFT JOIN (
            SELECT 
                abg.ASSOCIATE_ID as id,
                MAX(a1s.DATE_OF_MEETING) AS lastmeeting
            FROM ASSOCIATES_BACKGROUND_DATA abg
                LEFT JOIN ASSOCIATES_1_TO_1S a1s ON abg.ASSOCIATE_ID = a1s.ASSOCIATE_ID
            GROUP BY abg.ASSOCIATE_ID
            ) t ON t.id = abg.ASSOCIATE_ID
        LEFT JOIN ASSOCIATES_ACTION_STEPS aas ON abg.ASSOCIATE_ID = aas.ASSOCIATE_ID
        LEFT JOIN USERS u ON abg.PROGRAMME_COORDINATOR = u.ID
ORDER BY abg.NAME_KNOWN_AS

我尽量不使用 mysql 在其group by功能方面的许可(mysql 允许您通过指令摆脱不包括所有选定字段的组),并坚持标准。但随后有必要进行子查询(请参阅t别名)为每个关联预先计算 MAX(DATE),以便稍后将其与主记录集连接起来。

干杯。

PS:您可以再次添加与大学的连接,我跳过它只是为了隔离问题。

PPS:为了反映您的评论,我构建了这个查询:

SELECT 
    abg.ASSOCIATE_ID as ABG_ASSOCIATE_ID,
    abg.NAME_KNOWN_AS as ABG_NAME_KNOWN_AS, 
    abg.LAST_NAME as ABG_LAST_NAME, 
    u.NAME_KNOWN_AS as USERS_NAME_KNOWN_AS, 
    u.LAST_NAME as USERS_LAST_NAME, 
    t.lastmeeting,
    t2.av AS averagetimedue
FROM ASSOCIATES_BACKGROUND_DATA abg 
        LEFT JOIN (
            SELECT 
                abg.ASSOCIATE_ID as id,
                MAX(a1s.DATE_OF_MEETING) AS lastmeeting
            FROM ASSOCIATES_BACKGROUND_DATA abg
                LEFT JOIN ASSOCIATES_1_TO_1S a1s ON abg.ASSOCIATE_ID = a1s.ASSOCIATE_ID
            GROUP BY abg.ASSOCIATE_ID
            ) t ON t.id = abg.ASSOCIATE_ID
        LEFT JOIN (
            SELECT
                (AVG(DATE_DUE)+AVG(DATE_COMPLETED))/2 AS av,
                ASSOCIATE_ID
            FROM ASSOCIATES_ACTION_STEPS
            GROUP BY ASSOCIATE_ID
            ) t2 ON abg.ASSOCIATE_ID = t2.ASSOCIATE_ID
        LEFT JOIN ASSOCIATES_ACTION_STEPS aas ON abg.ASSOCIATE_ID = aas.ASSOCIATE_ID
        LEFT JOIN USERS u ON abg.PROGRAMME_COORDINATOR = u.ID
ORDER BY abg.NAME_KNOWN_AS

我不确定你的定义average time between DATE_DUE and DATE_COMPLETED

于 2013-11-01T17:02:36.357 回答