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

QuZ

Постоялец
Регистрация
18 Июл 2009
Сообщения
86
Реакции
50
Добрый вечер. Имеется 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
Спасибо.
 
MySqlJoinTypesThumbnail-774x1024.png
 
Я понимаю, что 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-мя таблица - особенно очень интересные решения. Сохранил
 
Последнее редактирование:
Но этот код не уверен, что оптимальный, особенно, при учете, того, что я работаю только, грубо говоря с 1000 строк из таблички
Лучше не придумаете. Только используйте не UNION а UNION ALL, так как первый еще шерстит дубликаты (а их в этом запросе не должно быть - если "уникальные").
И добавьте индекс на поля id и name, лучше такой, если селективность по id выше:
Код:
ALTER TABLE `...` ADD KEY(`id`, `name`);
И если хотите "уникальные" для второго и третьего подзапросов, то забыли условие типа "WHERE t2.id IS NULL"
 
  • Нравится
Реакции: QuZ
Лучше не придумаете. Только используйте не UNION а UNION ALL, так как первый еще шерстит дубликаты (а их в этом запросе не должно быть - если "уникальные").
И добавьте индекс на поля id и name, лучше такой, если селективность по id выше:
Код:
ALTER TABLE `...` ADD KEY(`id`, `name`);
И если хотите "уникальные" для второго и третьего подзапросов, то забыли условие типа "WHERE t2.id IS NULL"
Про индексы - спасибо, да, они есть. WHERE t2.id IS NULL - это и забыл. А про UNION ALL не совсем понял Вас. А почему не стоит объединять одинаковые результаты в одну строку?
 
Если по определению от объединяемых запросов будут разные, "не пересекающиеся" результаты - UNION ALL. Если просто UNION - мускул будет искать дубликаты, и тратить на это время. Судя по всему, это ваш случай.
 
Назад
Сверху