LEFT JOIN只显示第一个表的第一行一次

时间:2014-07-18 20:49:20

标签: mysql sql left-join

我有两个:

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视图中

2 个答案:

答案 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