2010-12-09 2 views
4

У меня есть две таблицы, books и authors. books имеет столбец author_id и столбец secondary_author_id (в книгах не более двух авторов). Я до сих пор делаю:Внутреннее соединение MySQL на двух столбцах

SELECT * FROM books 
LEFT JOIN authors 
ON books.author_id=authors.id 

который обрабатывает соединение с первым автором. Я не могу понять, как бы я работал с вторичным автором. Должен ли я изменить свою схему, или мне просто нужна помощь SQL?

ответ

4
SELECT  books.*, author1.*, author2.* 
FROM   books 
    LEFT JOIN author AS author1 
    ON   author1.author_id = books.author_id 
    LEFT JOIN author AS author2 
    ON   author2.author_id = books.secondary_author_id 

В SQL вы можете псевдонизировать таблицы, добавив их после имени таблицы. Просто будьте осторожны, теперь у вас будут повторяющиеся столбцы, поэтому вместо author1. * Вы, вероятно, захотите присвоить результаты как author1, так и author2.

EDIT

Дополнительная информация - Скажем, у вас есть ваша основная таблица (я буду включать детали, так что если люди хотят, чтобы проверить на их собственной, они могут):

CREATE DATABASE test; 
USE test; 

CREATE TABLE books 
(
    book_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    title VARCHAR(50), 
    author_id INT NOT NULL, 
    secondary_author_id INT 
); 

CREATE TABLE authors 
(
    author_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    name VARCHAR(50) 
); 

INSERT INTO authors (author_id,name) VALUES (1,'Sue Z. Que'),(2,'John Doe'),(3,'Bob Smith'); 
INSERT INTO books (book_id,title,author_id,secondary_author_id) VALUES (1,'JOIN-ing Two Tables',1,2); 

Если вы сделать выбор, я упомянул выше, результат будет следующим:

|----------------------- books TABLE -----------------------------|---- authors table -----|---- authors table ---| 
+---------+---------------------+-----------+---------------------+-----------+------------+-----------+----------+ 
| book_id | title    | author_id | secondary_author_id | author_id | name  | author_id | name  | 
+---------+---------------------+-----------+---------------------+-----------+------------+-----------+----------+ 
|  1 | JOIN-ing Two Tables |   1 |     2 |   1 | Sue Z. Que |   2 | John Doe | 
+---------+---------------------+-----------+---------------------+-----------+------------+-----------+----------+ 

(я добавил верхний заголовок просто ради calrity), вы себе e у вас есть два имени author_id и two name (так как они объединяются в одну и ту же таблицу и те же имена столбцов). НО, если вы псевдоним столбцы из стыки так:

SELECT  books.*, author1.name AS primary_author, author2.name AS secondary_author 
FROM   books 
    LEFT JOIN authors AS author1 
    ON   author1.author_id = books.author_id 
    LEFT JOIN authors AS author2 
    ON   author2.author_id = books.secondary_author_id; 

Вы получаете более чистый результат:

|----------------------- books TABLE -----------------------------| authors table -|- authors table --| 
+---------+---------------------+-----------+---------------------+----------------+------------------+ 
| book_id | title    | author_id | secondary_author_id | primary_author | secondary_author | 
+---------+---------------------+-----------+---------------------+----------------+------------------+ 
|  1 | JOIN-ing Two Tables |   1 |     2 | Sue Z. Que  | John Doe   | 
+---------+---------------------+-----------+---------------------+----------------+------------------+ 
2
SELECT books.* FROM books, authors.name, secondary_authors.name 
LEFT JOIN authors 
ON books.author_id=authors.id 
LEFT JOIN authors as secondary_authors 
ON books.secondary_author_id=secondary_authors.id 
+0

Проблема заключается в том, что есть таблица только один авторов. – Skilldrick 2010-12-09 15:51:27

+1

Точно, и это будет `join`-ed дважды. Брэд Кристи объяснил это подробно. – 2010-12-09 15:54:38

+0

Извините, я полностью неправильно прочитал его, спасибо – Skilldrick 2010-12-09 15:55:02

0

просто сделать еще один присоединиться на вторичном ид

1

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

Редактировать

Как ваш комментарий говорит: да, вам нужна таблица books_authors. Пока у вас настроены ваши индексы, это не большой успех.

Наиболее раздражающей частью является то, что вы часто захотите объединить авторов (одна запись в книге, объединяя всех авторов в один столбец). Вероятно, вы создадите для этого представление.

Смежные вопросы