我有两个:
Firest table: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
...
如果我做LEFT JOIN:
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视图中
答案 0 :(得分:2)
您可以使用变量执行此操作:
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表的属性。
编辑:
我认为这对于与视图兼容的子查询是不可能的,但是可能有可能给出查询数据(订购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;
答案 1 :(得分:1)
您可以使用案例陈述和子查询来确定某行是否是给定table2.id
table2.idTable
)
CREATE VIEW myView AS SELECT
t1.id id1,
(CASE
WHEN t2.idTable1 IS NULL OR NOT EXISTS (
SELECT 1
FROM table2 t3
WHERE t3.idTable1 = t2.idTable1
AND t3.id < t2.id
) THEN t1.text ELSE '-'
END) text1,
t2.id id2,
t2.idTable1,
t2.text2
FROM table1 t1
LEFT JOIN table2 t2 ON t1.id = t2.idTable1