【问题标题】:MySQL How to join records from another table which date is latestMySQL如何从另一个表中加入最新日期的记录
【发布时间】:2016-03-15 16:48:29
【问题描述】:

我有以下选择 SQL 查询:

SELECT i.instagrammer_id, CONCAT(i.first_name,' ',i.last_name) AS instagrammer_name, FLOOR(DATEDIFF (NOW(), i.date_of_birth)/365) AS age, i.date_of_birth, i.gender, i.email, i.created_date, GROUP_CONCAT(b.name_en) AS industrie_branch, coalesce(c.long_name, '')  AS long_name, s.social_id
FROM instagrammer AS i
LEFT JOIN social_login AS s ON s.instagrammer_id = i.instagrammer_id
LEFT JOIN industries_branches b ON FIND_IN_SET(b.industrie_branch_id, i.industrie_branch)
LEFT JOIN country_data c ON c.short_name = i.based_in_country
WHERE i.status IS NOT NULL
GROUP BY i.instagrammer_id
ORDER BY instagrammer_name DESC

并获取此记录:

现在我想通过从social_id 匹配来从另一个表加入,我在 SQL 结果之上但有一个条件,我需要记录 statistic_instagrammer_detail 表中的最新日期。

表:statistic_instagrammer_detail

id  instagrammer_id  followers  created_date
**  ***************  *********  *******************
28  440024439        190        2015-12-10 09:37:03
27  12095962         390        2015-12-10 09:36:03 
26  2238046564       544        2015-12-10 09:35:03
25  481959735        780        2015-12-10 09:34:04
24  440024439        151        2015-12-09 09:54:02
23  12095962         210        2015-12-09 09:53:02
22  2238046564       403        2015-12-09 09:52:02
21  481959735        659        2015-12-09 09:51:09

我想从上面的截图结果中添加followers

followers
*********
190
390
544
780

知道怎么做吗?

【问题讨论】:

  • 除了下面的评论,在我看来,在 PHP 解析的查询中包含 CONCAT 和/或 GROUP_CONCAT 是没有意义的 - 后者尤其是在 GROUP_CONCAT 是唯一聚合函数的情况下。

标签: php mysql date datetime join


【解决方案1】:
SELECT i.instagrammer_id, CONCAT(i.first_name,' ',i.last_name) AS instagrammer_name, FLOOR(DATEDIFF (NOW(), i.date_of_birth)/365) AS age, i.date_of_birth, i.gender, i.email, i.created_date, GROUP_CONCAT(b.name_en) AS industrie_branch, coalesce(c.long_name, '')  AS long_name, s.social_id,st.followers
FROM instagrammer AS i
LEFT JOIN statistic_instagrammer_detail as st ON  i.instagrammer_id=st.instagrammer_id
LEFT JOIN social_login AS s ON s.instagrammer_id = i.instagrammer_id
LEFT JOIN industries_branches b ON FIND_IN_SET(b.industrie_branch_id, i.industrie_branch)
LEFT JOIN country_data c ON c.short_name = i.based_in_country
WHERE i.status IS NOT NULL and st.created_date=(select MAX(created_date) from statistic_instagrammer_detail)
GROUP BY i.instagrammer_id
ORDER BY instagrammer_name DESC

【讨论】:

  • 收到错误#1054 - Unknown column 'st.followers' in 'field list'
  • 仍然出现同样的错误:#1054 - Unknown column 'st.followers' in 'field list'
  • @Mr.Happy 您一定是在上面的查询中遗漏了一个表别名。上面查询的问题不是你遇到的问题(这个错误很可能是你自己引入的),而是它从统计表中获取了整体的 max(created_date)。
【解决方案2】:

您需要在statistic_instagrammer_detail 表上创建一个子查询,根据instagrammer_id 从该表返回max(created_date),然后将statistic_instagrammer_detail 表连接到它以获取followers

SELECT i.instagrammer_id, CONCAT(i.first_name,' ',i.last_name) AS instagrammer_name, FLOOR(DATEDIFF (NOW(), i.date_of_birth)/365) AS age, i.date_of_birth, i.gender, i.email, i.created_date, GROUP_CONCAT(b.name_en) AS industrie_branch, coalesce(c.long_name, '')  AS long_name, s.social_id, st.followers
FROM instagrammer AS i
LEFT JOIN social_login AS s ON s.instagrammer_id = i.instagrammer_id
LEFT JOIN industries_branches b ON FIND_IN_SET(b.industrie_branch_id, i.industrie_branch)
LEFT JOIN country_data c ON c.short_name = i.based_in_country
LEFT JOIN (SELECT instagrammer_id,  max(created_date) as maxdate from statistic_instagrammer_detail group by instagrammer_id) t on i.instagrammer_id=t.instagrammer_id
LEFT JOIN statistic_instagrammer_detail st ON  i.instagrammer_id=st.instagrammer_id and t.maxdate=st.created_date
WHERE i.status IS NOT NULL
GROUP BY i.instagrammer_id
ORDER BY instagrammer_name DESC

但是请注意,您的查询将仅在某些配置设置下在 mysql 中运行并且违反 sql 标准,因为它包含选择列表中的字段,这些字段不在 group by 子句中,也没有聚合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 2019-10-14
    • 1970-01-01
    • 2014-07-05
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多