2017-07-11 1 views
2

は、私のテーブル構造である:JOINの結果がNULLかどうかを確認する方法はありますか?ここ

-- categories 
+----+-------------+ 
| id |  name | 
+----+-------------+ 
| 1 | political | 
| 2 | cultural | 
| 3 | social  | 
| 4 | historical | 
+----+-------------+ 

-- tags 
+----+-------------+-----------+-------------+-----------------+ 
| id |  name | parent_id | category_id | total_used_num | 
+----+-------------+-----------+-------------+-----------------+ 
| 1 | president | NULL  | 1   | 43    | 
| 2 | society  | NULL  | 3   | 345    | 
| 3 | Trump  | 1   | 1   | 5    | 
| 4 | book  | 5   | 2   | 5473   | 
| 5 | library  | NULL  | 2   | 433    | 
+----+-------------+-----------+-------------+-----------------+ 

そして、これは私のクエリです:

SELECT t1.name, 
     CONCAT(t2.name, ',', cat.name) t_p 
FROM tags t1 
     LEFT JOIN tags t2 
       ON t1.parent_id = t2.id 
     INNER JOIN categories cat 
       ON t1.category_id = cat.id 
ORDER BY total_used_num DESC, 
      t1.id 

/* output 
+----+-------------+--------------------------+ 
| 1 | president | NULL      | 
| 2 | society  | NULL      | 
| 3 | Trump  | president,political  | 
| 4 | book  | library,cultural   | 
| 5 | library  | NULL      | 
+----+-------------+--------------------------+ 

参照してください? CONCATNULLの結果はNULLです。とにかく、どうすればそれを避けることができますか?また、コンマを,の条件付きにしたいと思います。両方のフィールドがNULLでなければ、そのコンマがそこにあるはずです。これは期待された結果

+----+-------------+--------------------------+ 
| 1 | president | political    | 
| 2 | society  | social     | 
| 3 | Trump  | president,political  | 
| 4 | book  | library,cultural   | 
| 5 | library  | cultural     | 
+----+-------------+--------------------------+ 

私はそれをどのように行うことができますか?

答えて

2

だけconcat_ws()を使用します。

SELECT t1.name, 
     CONCAT_WS(',', t2.name, cat.name) as t_p 
FROM tags t1 LEFT JOIN 
    tags t2 
    ON t1.parent_id = t2.id INNER JOIN 
    categories cat 
    ON t1.category_id = cat.id 
ORDER BY total_used_num DESC, t1.id ; 
+2

あなたは誰ですか?あなたは1分以内に私の質問を読みましたか?あなたは本当に素晴らしい人です。私が感銘を受けた。 – stack

0

あなたはcase文を使用することができます。ここでOracleのクエリがある、あなたは、MySQLのためにそれを変更することができます。

SELECT t1.name, 
      (case when t2.name is not null then (t2.name || ', ') else '' end) || cat.name 
FROM tags t1 
     LEFT JOIN tags t2 
       ON t1.parent_id = t2.id 
     INNER JOIN categories cat 
       ON t1.category_id = cat.id 
ORDER BY t1.total_used_num DESC, 
      t1.id ; 
0

ただ、ユースケースステートメントは、あなたが期待される出力を取得するようにWHEN。 下記のコードを参照してください。

SELECT t1.name, (CASE 
       WHEN (t2.name IS NULL) 
       THEN cat.name 
       ELSE (CONCAT(t2.name, ',', cat.name)) 
       END) AS t_p 
FROM tags t1 
     LEFT JOIN tags t2 
       ON t1.parent_id = t2.id 
     INNER JOIN categories cat 
       ON t1.category_id = cat.id 
関連する問題