我有两个:
先发表:table1
id | text
-------------
1 t1
2 t2
...
第二张表:table2
id | idTable1 | text2
-------------------------------
1 1 text1Table2
2 1 text2Table2
3 1 text3Table2
4 2 text4Table2
5 2 text5Table2
...
如果我做左连接:
SELECT * FROM table1 t1 LEFT JOIN table2 t2 ON t1.id=t2.idTable1
结果是这样的:
id | text | id | idTable1 | text2
------------------------------------------
1 t1 1 1 text1Table2
1 t1 2 1 text2Table2
1 t1 3 1 text3Table2
2 t2 4 2 text4Table2
2 t2 5 2 text5Table2
...
但我希望第一个表中重复的行只显示一次,如下所示:
id | text | id | idTable1 | text2
------------------------------------------
1 t1 1 1 text1Table2
1 - 2 1 text2Table2
1 - 3 1 text3Table2
2 t2 4 2 text4Table2
2 - 5 2 text5Table2
...
编辑: 并将此结果添加到 mysql View 中
最佳答案
您可以使用变量来做到这一点:
SELECT t1.id,
if(@prevtext = text, '-', if(@prevtext := text, t1.text, t1.text)) as text,
t2.id, t2.idTable1, t2.text2
FROM table1 t1 LEFT JOIN
table2 t2
ON t1.id = t2.idTable1 CROSS JOIN
(select @prevtext := '') vars
ORDER BY t1.id, t1.text;
但是,我不鼓励你这样做。 SQL 中的结果集与表具有相同的属性。即,每一行都独立于其他行。当您以这种格式放置数据时,您需要对结果集进行特定排序,因此它不再具有 SQL 表的属性。
编辑:
我认为这对于与 View 兼容的子查询是不可能的,但考虑到您的查询数据(t2 id 已排序),这可能是可能的:
SELECT t1.id,
(case when text = (select text
from table2 tt2
where tt2.id < t2.id
order by tt2.id desc
limit 1
)
then '-' else text
end) as text
t2.id, t2.idTable1, t2.text2
FROM table1 t1 LEFT JOIN
table2 t2
ON t1.id = t2.idTable1
ORDER BY t1.id, t2.id;
关于mysql - LEFT JOIN 只显示第一个表的第一行一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24833582/