Обработка 2-вух таблиц в MySQL

Тема в разделе "Базы данных", создана пользователем QuZ, 2 ноя 2017.

Модераторы: latteo
  1. QuZ

    QuZ Постоялец

    Регистр.:
    18 июл 2009
    Сообщения:
    84
    Симпатии:
    49
    Добрый вечер. Имеется 2-ве таблицы
    ID;NAME

    Помогите с запросом, мне надо вывести 3-ри блока информации из этих 2-вух таблиц с помощью JOIN в 4-ре колонки - t1.ID,t1.NAME,t2.ID,t2.NAME
    1) Все записи, где t1.ID = t2.ID и t1.NAME = t2.NAME (во все 4-ре колонки)
    2) t1.ID,t1.NAME, уникальные строки первой таблицы в 2-ве первые колонки
    3) t2.ID,t2.NAME, уникальные строки второй таблицы в 2-ве вторые колонки

    Т.е. чтобы общее кол-во строк было = количеству уникальных строк в 2-вух таблицах, и не уникальные были в RIGHT JOIN и LEFT JOIN
    Спасибо.
     
  2. Black Hat

    Black Hat

    Регистр.:
    15 май 2015
    Сообщения:
    155
    Симпатии:
    101
  3. QuZ

    QuZ Постоялец

    Регистр.:
    18 июл 2009
    Сообщения:
    84
    Симпатии:
    49
    Я понимаю, что INNER JOIN после UNION и т.д.
    Во первых - не хочется использовать UNION ( по возможности), т.к. 3 запроса одни и тех-же данных увеличат в 3-ри раза ответ, а когда данных много - это существенно сказывается.
    А во вторых - не хочу нагородить кастылей, так как при большом кол-ве записей выявить их будет тяжело.

    Т.е. получить что-то аля -
    Код:
    SELECT t1.`id`, t1.`name`, t2.`id`, t2.`name` FROM t1
    INNER JOIN t2 ON t1.`id` = t2.`id` AND t1.`name` = t2.`name`
    UNION
    SELECT t1.`id`, t1.`name`, t2.`id`, t2.`name` FROM t1
    LEFT OUTER JOIN t2 ON t1.`id` = t2.`id` AND t1.`name` = t2.`name`
    UNION
    SELECT t1.`id`, t1.`name`, t2.`id`, t2.`name` FROM t1
    RIGHT OUTER JOIN t2 ON t1.`id` = t2.`id` AND t1.`name` = t2.`name`

    Ответ по задумке -
    Код:
    1    cat    1    cat
    2    dog    2    dog
    3    frog
                   4   mouse

    Но этот код не уверен, что оптимальный, особенно, при учете, того, что я работаю только, грубо говоря с 1000 строк из таблички ( WHERE `cat` = '1'), а обе таблицы в 900 000 и 1100 000 строк..
    По этому и спросил помощи у местных людей, кто хорошо знакомы со скулом.


    Код:
    1    cat
    2    dog
    3    frog

    Код:
    1    cat
    2    dog
    4    mouse

    За картинку спасибо, с 3-мя таблица - особенно очень интересные решения. Сохранил
     
    Последнее редактирование: 2 ноя 2017
  4. Black Hat

    Black Hat

    Регистр.:
    15 май 2015
    Сообщения:
    155
    Симпатии:
    101
    Лучше не придумаете. Только используйте не UNION а UNION ALL, так как первый еще шерстит дубликаты (а их в этом запросе не должно быть - если "уникальные").
    И добавьте индекс на поля id и name, лучше такой, если селективность по id выше:
    Код:
    ALTER TABLE `...` ADD KEY(`id`, `name`);
    
    И если хотите "уникальные" для второго и третьего подзапросов, то забыли условие типа "WHERE t2.id IS NULL"
     
    QuZ нравится это.
  5. QuZ

    QuZ Постоялец

    Регистр.:
    18 июл 2009
    Сообщения:
    84
    Симпатии:
    49
    Про индексы - спасибо, да, они есть. WHERE t2.id IS NULL - это и забыл. А про UNION ALL не совсем понял Вас. А почему не стоит объединять одинаковые результаты в одну строку?
     
  6. Black Hat

    Black Hat

    Регистр.:
    15 май 2015
    Сообщения:
    155
    Симпатии:
    101
    Если по определению от объединяемых запросов будут разные, "не пересекающиеся" результаты - UNION ALL. Если просто UNION - мускул будет искать дубликаты, и тратить на это время. Судя по всему, это ваш случай.