0

次のテーブルを使用した単純な記事とコメントのシステムがあります。

記事テーブル:

id | writer | text
 1 | Bob    | first article
 2 | Marley | second article

コメント表:

id | article_id | comment
 1 |      1     |  i love this article
 2 |      1     |  good one
 3 |      2     |  waiting for more

その下にコメントがある各記事を選択したいと思います。次のクエリを使用します。

SELECT * FROM articles LEFT JOIN comments ON articles.id = comments.article_id 

私が得る結果:

 articles.id   | articles.writer | articles.text  | comments.id | comments.article_id | comments.comment
 1             | Bob             | first article  |    1        |         1           | i love this article
 1             | Bob             | first article  |    2        |         1           | good one  
 2             | Marley          | second article |    3        |         2           | waiting for more   

私が欲しいもの:

articles.id   | articles.writer | articles.text  | comments.id | comments.article_id | comments.comment
 1            | Bob             | first article  |    1        |         1           | i love this article
NULL          | NULL            |    NULL        |    2        |         1           | good one  
 2            | Marley          | second article |    3        |         2           | waiting for more 

では、コメント付きの各記事を選択し、各コメントではなく一度だけ記事を表示するにはどうすればよいですか

ありがとう

4

1 に答える 1

6

これを行うには、MySQL でユーザー変数を使用できます。

SELECT 
  case when rownum =1 then id else null end id,
  case when rownum =1 then writer else null end writer,
  case when rownum =1 then text else null end text,
  comment
FROM
(
  SELECT a.id, a.writer, a.text,
    c.article_id, c.comment, 
    @rownum := case
                when @prev = a.id
                  and @prev_art = c.article_id
                then @rownum+1 else 1 end rownum,
    @prev := a.id p_id,
    @prev_art := c.article_id p_art
  FROM articles a
  LEFT JOIN comments c
    ON a.id = c.article_id 
  ORDER BY a.id, article_id
) src

SQL Fiddle with Demoを参照してください。

結果は次のとおりです。

|     ID | WRITER |           TEXT |             COMMENT |
----------------------------------------------------------
|      1 |    Bob |  first article | i love this article |
| (null) | (null) |         (null) |            good one |
|      2 | Marley | second article |    waiting for more |

が必要な場合は編集comment.idして、結果に追加できます。

SELECT 
  case when rownum =1 then id else null end id,
  case when rownum =1 then writer else null end writer,
  case when rownum =1 then text else null end text,
  commentid,
  article_id,
  comment
FROM
(
  SELECT a.id, a.writer, a.text,
    c.article_id, c.comment, c.id commentid,
    @rownum := case
                when @prev = a.id
                  and @prev_art = c.article_id
                then @rownum+1 else 1 end rownum,
    @prev := a.id p_id,
    @prev_art := c.article_id p_art
  FROM articles a
  LEFT JOIN comments c
    ON a.id = c.article_id 
  ORDER BY a.id, article_id
) src

SQL Fiddle with Demoを参照してください。結果は次のとおりです。

|     ID | WRITER |           TEXT | COMMENTID | ARTICLE_ID |             COMMENT |
-----------------------------------------------------------------------------------
|      1 |    Bob |  first article |         1 |          1 | i love this article |
| (null) | (null) |         (null) |         2 |          1 |            good one |
|      2 | Marley | second article |         3 |          2 |    waiting for more |
于 2013-01-25T21:14:33.953 に答える