MySql查询以获取每个国家/地区用于每个目的的天数?(获取第一个表中存在的第二个表中所有记录的计数)

MySql查询以获取每个国家/地区用于每个目的的天数?(获取第一个表中存在的第二个表中所有记录的计数),mysql,sql,database,Mysql,Sql,Database,我有三张表,分别是tl_log、tl_geo_countries和tl_purpose。我试图在表“tl_日志”中获得每个国家在表“tl_目的”中针对每个目的花费的天数。 我尝试了下面的mysql查询 SELECT t.country_id AS countryID,t.reason_id AS reasonID,count(t.reason_id) AS days,c.name AS country, p.purpose AS purpose FROM `tl_log` AS t LEFT

我有三张表,分别是tl_log、tl_geo_countries和tl_purpose。我试图在表“tl_日志”中获得每个国家在表“tl_目的”中针对每个目的花费的天数。 我尝试了下面的mysql查询

SELECT t.country_id AS countryID,t.reason_id AS reasonID,count(t.reason_id) AS 
days,c.name AS country, p.purpose AS purpose
FROM `tl_log` AS t
LEFT JOIN tl_geo_countries AS c ON t.country_id=c.id
LEFT JOIN tl_purpose AS p ON t.reason_id=p.id
GROUP BY t.reason_id,t.country_id ORDER BY days DESC
但最终以失败告终

我无法在“tl_日志”中获得表“tl_日志”中不存在的每个国家的计数。非常感谢您的帮助。另外,如果问题难以理解,请告诉我

预期输出:

以下是这三个表的结构

tl\u日志

tl\U geo\U国家

tl\u目的


如果您想要所有可能的国家/地区和目的的组合,即使是那些没有出现在日志表中的国家/地区(这些国家/地区的计数将显示为0),左连接应替换为右连接,您可以先执行两个表的笛卡尔乘积(a
CROSS
join),然后
LEFT
连接到日志表:

SELECT 
    c.id AS countryID,
    p.id AS reasonID,
    COUNT(t.reason_id) AS days,
    c.name AS country, 
    p.purpose AS purpose
FROM 
    tl_geo_countries AS c 
  CROSS JOIN
    tl_purpose AS p 
  LEFT JOIN
    tl_log AS t
      ON  t.country_id = c.id
      AND t.reason_id = p.id
GROUP BY 
    p.id,
    c.id 
ORDER BY 
    days DESC ;
如果您只希望记录日志表中存在的国家/地区(但仍然是所有可能的原因/目的),则需要稍作修改:

SELECT 
    c.id AS countryID,
    p.id AS reasonID,
    COUNT(t.reason_id) AS days,
    c.name AS country, 
    p.purpose AS purpose
FROM 
    ( SELECT DISTINCT
          country_id
      FROM 
          tl_log 
    ) AS dc  
  JOIN
    tl_geo_countries AS c
      ON c.id = dc.country_id
  CROSS JOIN
    tl_purpose AS p 
  LEFT JOIN
    tl_log AS t
      ON  t.country_id = c.id
      AND t.reason_id = p.id
GROUP BY 
    p.id,
    c.id 
ORDER BY 
    days DESC ;

如果您想要所有可能的国家和目的组合,即使是那些没有出现在日志表上的国家和目的(这些将以计数0显示),您可以先执行两个表的笛卡尔乘积(a
交叉
连接),然后
连接到日志表:

SELECT 
    c.id AS countryID,
    p.id AS reasonID,
    COUNT(t.reason_id) AS days,
    c.name AS country, 
    p.purpose AS purpose
FROM 
    tl_geo_countries AS c 
  CROSS JOIN
    tl_purpose AS p 
  LEFT JOIN
    tl_log AS t
      ON  t.country_id = c.id
      AND t.reason_id = p.id
GROUP BY 
    p.id,
    c.id 
ORDER BY 
    days DESC ;
如果您只希望记录日志表中存在的国家/地区(但仍然是所有可能的原因/目的),则需要稍作修改:

SELECT 
    c.id AS countryID,
    p.id AS reasonID,
    COUNT(t.reason_id) AS days,
    c.name AS country, 
    p.purpose AS purpose
FROM 
    ( SELECT DISTINCT
          country_id
      FROM 
          tl_log 
    ) AS dc  
  JOIN
    tl_geo_countries AS c
      ON c.id = dc.country_id
  CROSS JOIN
    tl_purpose AS p 
  LEFT JOIN
    tl_log AS t
      ON  t.country_id = c.id
      AND t.reason_id = p.id
GROUP BY 
    p.id,
    c.id 
ORDER BY 
    days DESC ;

为了更好地理解,你能发布一份预期输出的副本吗?这里是我的右连接“选择t.country\u id作为countryID,count(t.reason\u id)作为天数,c.名称作为国家,p.目的作为目的从
tl_旅行日志
AS t左加入tl_geo_国家作为c在t.国家_id=c.id右加入tl_目的作为p在t.原因_id=p.id组按t.原因_id,t.国家_id按天顺序描述”我将发布预期输出的图像。请查看我刚才添加的问题中的预期输出。如果TL_日志表中没有国家,您是否也希望它显示在输出中?您可以发布一份预期输出的副本以更好地理解这是我的权利“选择t.country\u id作为countryID,计数(t.reason\u id)作为天数,c.name作为国家,p.purpose作为目的,从
t.travel\u log
t左加入t.country\u geo\u国家作为c ON t.country\u id=c.id右加入t.reason\u id=p.id按t.reason\u id分组,t.country\u id按天顺序描述”“几分钟后就得到了输出,我将发布预期输出的图像。请查看我刚才添加的问题中的预期输出。如果TL_日志表中没有国家,您是否也希望它出现在输出中?意外结果。我只想要tl_logI中存在的国家的记录,我认为第二个查询有效。我还在测试它。完成后,我会将解决方案标记为已接受。非常感谢你的帮助。意外的结果。我只想要tl_logI中存在的国家的记录,我认为第二个查询有效。我还在测试它。完成后,我会将解决方案标记为已接受。非常感谢你的帮助。