1

これはかなり単純なことだと思います。以前にやったことがありますが、方法を思い出せません。

では、1 対多の関係があるとしましょう。2 つのテーブルを結合したいのですが、左側のテーブルの重複を許可しません。

SQLFIDDLE

したがって、上記の SQLFiddle に基づいて、私の結果は次のようになります。

categories.title  |  items.NAME  |  items.category_id
-----------------------------------------------------
red               | apple        | 1
red               | car          | 1
red               | paper        | 1
yellow            | lego         | 2
yellow            | banana       | 2
blue              | pen          | 3

私はそれが欲しい:

categories.title  |  items.NAME  |  items.category_id
-----------------------------------------------------
red               | apple        | 1
NULL              | car          | 1
NULL              | paper        | 1
yellow            | lego         | 2
NULL              | banana       | 2
blue              | pen          | 3

私の理由は、このようにすると、PHP でさらに処理を行う必要なく、結果を簡単にループできるからです。

4

2 に答える 2

4

値は次のように置き換えることができます。

select 
  case when rownum = 1 then title else null end title,
  name,
  category_id
from
(
  SELECT c.title, 
    i.name, 
    i.category_id,
    @row:=(case when @prev=title and @precat=category_id 
           then @row else 0 end) + 1 as rownum,
    @prev:=title ptitle,
    @precat:=category_id pcat
  FROM items AS i
  INNER JOIN categories AS c 
    ON c.id = i.category_id
   order by i.category_id, c.title
) src
order by category_id, rownum

SQL FiddlewithDemoを参照してください

結果は次のとおりです。

|  TITLE |   NAME | CATEGORY_ID |
---------------------------------
|    red |  apple |           1 |
| (null) |    car |           1 |
| (null) |  paper |           1 |
| yellow |   lego |           2 |
| (null) | banana |           2 |
|   blue |    pen |           3 |
于 2013-01-11T20:55:28.020 に答える