我有很多表,我试图在一个查询中从其中的许多表中提取数据。我已经研究了如何成功地使用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
非常感谢您提供的任何帮助或指示...
答案 0 :(得分: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
的定义。