1

我相信这是一件非常简单的事情,我发誓我以前做过,但我不记得怎么做了。

所以假设我有一个一对多的关系。我想加入这两个表,但不允许左表重复。

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 Fiddle

结果是:

|  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 回答
0

这可能是很久以前的帖子了。但我会将我的答案发布给未来的读者。还有另一个过程轻松且易于理解。

您可以充分利用变量。不需要子查询。

SET @previous:="";

SELECT
  IF(C.title=@previous, "", @previous:=C.title) AS Titles,
  I.name, I.category_id
FROM items I
INNER JOIN categories AS C ON C.id = I.category_id
ORDER BY I.id, I.name

@previous是正在使用的变量。

SQL 小提琴演示

于 2021-01-19T04:14:12.380 回答