удалить дубликаты на левой таблице, сохраняя дубликаты на правой таблице SELECT JOIN

0

Я пытаюсь подключиться к двум таблицам и выводить их, чтобы я не получал дубликатов из первой таблицы. В первой таблице нет дубликатов идентификатора, где я соединяю две таблицы, но во второй таблице может быть несколько экземпляров.

Я попытался "GROUP BY" на id в первой таблице, но, конечно, удаляет дубликаты во второй таблице.

Должен ли я попытаться использовать какой-то вложенный 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
Теги:
select
join
duplicates

1 ответ

0

Я против того, что кажется "неестественным" манипулированием результатами с использованием 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

NB При использовании результата такого запроса вы не должны заказывать ни один из столбцов, где некоторые значения подавляются/скрыты.

  • 0
    Хорошо, я понимаю, что это не тот путь. Спасибо @Used_By_Al Уже за то, что выправили меня прямо. Как вы предложили, я постараюсь найти лучший подход, форматируя вместо этого вывод.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню