删除左表上的重复项,同时在右表SELECT JOIN上保留重复项

栏目: 类库 · 发布时间: 2021-04-17

简介  这篇文章主要介绍了删除左表上的重复项,同时在右表SELECT JOIN上保留重复项以及相关的经验技巧,文章约1637字,浏览量396,点赞数5,值得参考!

我正在尝试连接两个表并输出它们,以便我不会从第一个表中获得任何重复项。在第一个表中,我在加入两个表的id上没有重复项,但在第二个表中可能有几个实例。

我在第一个表的id上尝试了“GROUP BY”,但这当然消除了第二个表中的重复项。

我应该尝试使用某种嵌套的SELECT或做你建议的吗?

似乎我被困住了,我会感激所有帮助。

这是我的查询:

$time_query = "SELECT time.id, time.time_in, time.time_out, time.comment, time.user_id, time_break.break_in AS break_in, time_break.break_out AS break_out, time_break.time_id AS time_id 
            FROM `time`
            LEFT JOIN time_break
            ON time.id = time_break.time_id
            WHERE time.time_out != '' AND time.user_id= $uid
            ORDER BY time.id ASC
答案

我反对使用SQL看起来像“不自然”的结果操作,但是你可能会看到这里有多尴尬是一种抑制(或“隐藏”)你不想看到的值的方法。

在我看来,这应该在“表示层”完成,但在MySQL中你可以使用变量来考虑以前的行值:

SELECT
      @row_num :=IF(@prev_value = t.id , @row_num + 1, 1) AS RowNumber
    , t.id
    , IF(@row_num = 1,t.id, '')       AS t_id
    , IF(@row_num = 1,t.time_in, '')  AS time_in
    , IF(@row_num = 1,t.time_out, '') AS time_out
    , IF(@row_num = 1,t.comment, '')  AS comment
    , IF(@row_num = 1,t.user_id, '')  AS user_id
    , tb.break_in                     AS break_in
    , tb.break_out                    AS break_out
    , tb.time_id                      AS time_id
    , @prev_value := t.id
FROM `time` AS t
LEFT JOIN time_break AS tb ON t.id = tb.time_id
CROSS JOIN (SELECT @row_num :=1,  @prev_value :='') vars
WHERE t.time_out <> ''
AND t.user_id = @UID
ORDER BY
      t.id ASC
    , t.time_in ASC
    , tb.break_in ASC

注意:使用此类查询的结果时,不应按任何抑制/隐藏某些值的列进行排序。


以上就是本文的全部内容,希望对大家的学习有所帮助,本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

MySql(五)(示例代码)

8.3.7 - mysql 表之间关系(示例代码)

外键的变种 三种关系

PHP操作Mysql(示例代码)

外键的变种 三种关系

外键的三种形式

数据库左连接、右连接、内连接

7-外键的变种 三种关系