2012-08-24 32 views
1

我有三个表tl_log,tl_geo_countries,tl_purpose。我试图在表'tl_purpose'中为每个目的获得表'tl_log'中每个国家花费的天数。 我下面试过mysql查询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 

但是登陆了。

enter image description here

我不能够得到计数宗旨,为在“tl_log”中不存在表“tl_log”每一个国家。任何帮助是极大的赞赏。另外,如果问题难以理解,请让我知道。

预期输出:

enter image description here

下面是这三个表的结构

tl_log

tl_log

个tl_geo_countries

tl_geo_countries

tl_purpose

tl_purpose

回答

1

被替换如果你想国家和宗旨的所有可能的组合,即使是那些不出现在日志表上(这些将显示为机智)哈0计数),你可以先做两个表的笛卡尔积(一CROSS加入),然后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

中意外的结果。我只想记录tl_log中存在的国家 – stephen

+0

我认为第二个查询是有效的。我仍在测试它。一旦完成,我会将解决方案标记为已接受。非常感谢你的帮助。 – stephen

0

LEFT JOINRIGHT JOIN

+0

我试过了,但它仍然没有工作。 – stephen

+0

你可以张贴预期输出的副本,以便更好地了解 – rshetye

+0

这里是我的右连接“选择t.country_id AS countryID,计数(t.reason_id)AS天,c.name AS国家,p.purpose AS目的 FROM'tl_travel_log 'AS t LEFT JOIN tl_geo_countries AS c ON t.country_id = c.id RIGHT JOIN tl_purpose AS p ON t.reason_id = p.id GROUP BY t.reason_id,t.country_id ORDER BY days DESC“并获得输出作为http://i46.tinypic.com/21oq5v.png – stephen

相关问题