У меня есть следующие таблицы:ВЫБРАТЬ из нескольких таблиц с использованием составного первичного ключа
Users:
+--------+------+
| UserID | Name |
+--------+------+
| 1 | Bob |
| 2 | Mike |
| 3 | Tim |
| 4 | Joe |
+--------+------+
Friends:
+---------+---------+
| UserID1 | UserID2 |
+---------+---------+
| 1 | 2 |
| 1 | 3 |
| 3 | 4 |
| 4 | 2 |
+---------+---------+
Теперь, скажем, Боб входит в мою службу. Мне нужно запустить запрос, который будет загружать все его UserIDs его друзей, а также их имена.
Bob's friends:
+--------+------+
| UserID | Name |
+--------+------+
| 2 | Mike |
| 3 | Tim |
+--------+------+
Обратите внимание, что таблица «Друзья» содержит составной первичный ключ с использованием как UserID1, так и UserID2. Каждая «дружба» указана только в таблице один раз.
Что было бы лучшим способом справиться с этим? Другими словами, какой запрос следует использовать для поиска друзей пользователя, состоящего как из их UserID, так и Name? Очевидно, что для выбора данных из нескольких таблиц потребуется какое-то предложение JOIN.
Это очень продуманный ответ на то, что кажется простым вопросом с быстрым взглядом. Могу ли я со всем уважением предложить изменить «UNION ALL» на «UNION»? Это потому, что никто не заставит нас вставлять '(2, 4)' в таблицу 'friends'. «UNION» устранит удвоенный результат. Смотрите это [скрипка] (http://sqlfiddle.com/#!9/fa1fa/4). Знаете ли вы способ (другой, затем триггер), чтобы предотвратить вставку обратного ключа здесь? – MyBrainHurts
Использование 'UNION' вместо' UNION ALL' приведет к тому, что MySQL выполнит операцию «sort unique» для устранения повторяющихся строк. И это может быть дорогостоящим на больших наборах. Если эта операция не требуется, мы обычно получаем лучшую производительность с помощью «UNION ALL». В вопросе указывалось, что дружба хранится только один раз в таблице. Вы абсолютно правы, что если оба (2,4) и (4,2) сохраняются в таблице, этот запрос будет возвращать «дублированные» результаты. И нет, я не знаю, каким образом база данных может принуждать ограничение к избыточным строкам без триггера. – spencer7593