MySql: дублирование одной строки несколько раз

Discussion in 'PHP' started by GAiN, 9 Feb 2023.

  1. GAiN

    GAiN Elder - Старейшина

    Joined:
    2 Apr 2011
    Messages:
    2,550
    Likes Received:
    172
    Reputations:
    99
    Здравствуйте.
    Есть две таблицы.
    Первая таблица выводит временные интервалы, которые в ней присутствуют и на основании таблицы 2 они отмечаются как занятые.
    Всё работает но при наполнении таблицы 2 строки которые выводятся из таблицы 1 начинают дублироваться, сколько записей добавлено в таблицу 2 - столько раз и дублируются.
    10:00
    10:00
    10:00 - итд если в таблице 2 было 3 строки добавлено, если больше, то так же и увеличит вывод из первой таблицы.

    Помогите пожалуйста решить эту проблему ?

    SQL запрос:
    Code:
    SELECT `timeslot`, `timeslot_req`, `specialist`, `specialist_req`, `categories`, `status`, `categories_req`
    FROM `'.$prefix.$table_1.'`, `'.$prefix.$table_2.'`
    WHERE DATE(timeslot) = "'.$datetime->format("Y-m-d").'" AND specialist="'.$specialist.'" AND categories = "'.$categories.'" ORDER BY timeslot ASC
     
  2. BigBear

    BigBear Escrow Service
    Staff Member Гарант - Escrow Service

    Joined:
    4 Dec 2008
    Messages:
    1,801
    Likes Received:
    920
    Reputations:
    862
    как будто просится расставить алиасы, чтобы понять что где и откуда дергается
     
    _________________________
  3. alexzir

    alexzir Well-Known Member

    Joined:
    29 Oct 2019
    Messages:
    961
    Likes Received:
    2,306
    Reputations:
    25
    Похоже, после BY нужно явно прописать ещё и имя таблицы, в которую записывается значение. А то при обработке скрипт обращается к обоим таблицам и пишет, соответственно, в обе сразу.
     
  4. sherxan-g

    sherxan-g Member

    Joined:
    6 Jan 2016
    Messages:
    77
    Likes Received:
    18
    Reputations:
    0
    Предположим, что таблица 1 называется table_1, а таблица 2 - table_2. Тогда ваш запрос можно переписать следующим образом
    Code:
    SELECT DISTINCT t1.timeslot, t1.specialist, t1.categories, IFNULL(t2.status, 'free') as status
    FROM table_1 t1
    LEFT JOIN table_2 t2 ON t1.timeslot = t2.timeslot AND t1.specialist = t2.specialist AND t1.categories = t2.categories
    WHERE DATE(t1.timeslot) = "'.$datetime->format("Y-m-d").'" AND t1.specialist="'.$specialist.'" AND t1.categories = "'.$categories.'"
    ORDER BY t1.timeslot ASC