2010-12-09 51 views
4

我有兩個表,booksauthorsbooks有一個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的結果。

編輯

其他詳細信息 - 假設你有你的基本表(我會包括詳細信息,這樣,如果人們想測試自己的,他們可以):

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 | 
+---------+---------------------+-----------+---------------------+-----------+------------+-----------+----------+ 

(我已經添加了頂級頭只是爲了保持平靜)你se e你有兩個author_id和兩個名字(因爲它們是同一個表和相同列名的連接)。但是,如果你的別名列從加入像這樣:

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

的問題是,只有一個authors表。 – Skilldrick 2010-12-09 15:51:27

+1

確切的說,它會被連接兩次。布拉德克里斯蒂詳細解釋它。 – 2010-12-09 15:54:38

+0

對不起,我完全誤解了,謝謝 – Skilldrick 2010-12-09 15:55:02

0

剛做了另外加入次級ID

1

你需要重新考慮你的設計,因爲有一天會有一本書三位作者,並於次日將有一本書爲零。 (我一直在那裏我自己。)

編輯

至於您的評論說:是的,你需要一個books_authors表。只要你的索引設置得當,這不是一個大的表現。

最煩人的部分是,你經常想要將作者串起來(每本書一個條目,將所有作者連接成一個列)。你可能最終會爲此創建一個視圖。