我相信这是一件非常简单的事情,我发誓我以前做过但我不记得是怎么回事。
所以,让我说我有一对多的关系。我想加入两个表,但不允许左表重复。
基于上面的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进行任何进一步处理。
答案 0 :(得分: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
结果是:
| TITLE | NAME | CATEGORY_ID |
---------------------------------
| red | apple | 1 |
| (null) | car | 1 |
| (null) | paper | 1 |
| yellow | lego | 2 |
| (null) | banana | 2 |
| blue | pen | 3 |
答案 1 :(得分: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
是正在使用的变量。