1

tl_log、tl_geo_countries、tl_purpose の 3 つのテーブルがあります。テーブル「tl_purpose」の目的ごとに、テーブル「tl_log」で各国で過ごした日数のカウントを取得しようとしています。以下の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_log' に存在しない 'tl_log' の各国の目的のカウントを取得できません。どんな助けでも大歓迎です。また、質問がわかりにくい場合はお知らせください。

期待される出力:

ここに画像の説明を入力

以下は、これら3つのテーブルの構造です

tl_log

tl_log

tl_geo_countries

tl_geo_countries

tl_purpose

tl_purpose

4

2 に答える 2

1

国と目的のすべての可能な組み合わせが必要な場合は、ログテーブルに表示されないもの(これらは0のカウントで表示されます)でも、最初に2つのテーブルのデカルト積(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 ;
于 2012-08-24T08:13:12.267 に答える
0

LEFT JOINに置き換える必要がありますRIGHT JOIN

于 2012-08-24T07:20:20.217 に答える