我有兩個表,books
和authors
。 books
有一個author_id
列和一個secondary_author_id
列(沒有書籍有兩個以上的作者)。我很遠在做:MySQL內連接兩列
SELECT * FROM books
LEFT JOIN authors
ON books.author_id=authors.id
這是處理與第一作者的連接。但我無法弄清楚如何處理第二作者。我應該改變我的模式,還是隻需要一點SQL幫助?
我有兩個表,books
和authors
。 books
有一個author_id
列和一個secondary_author_id
列(沒有書籍有兩個以上的作者)。我很遠在做:MySQL內連接兩列
SELECT * FROM books
LEFT JOIN authors
ON books.author_id=authors.id
這是處理與第一作者的連接。但我無法弄清楚如何處理第二作者。我應該改變我的模式,還是隻需要一點SQL幫助?
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 |
+---------+---------------------+-----------+---------------------+----------------+------------------+
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
剛做了另外加入次級ID
你需要重新考慮你的設計,因爲有一天會有一本書三位作者,並於次日將有一本書爲零。 (我一直在那裏我自己。)
編輯
至於您的評論說:是的,你需要一個books_authors表。只要你的索引設置得當,這不是一個大的表現。
最煩人的部分是,你經常想要將作者串起來(每本書一個條目,將所有作者連接成一個列)。你可能最終會爲此創建一個視圖。
的問題是,只有一個authors表。 – Skilldrick 2010-12-09 15:51:27
確切的說,它會被連接兩次。布拉德克里斯蒂詳細解釋它。 – 2010-12-09 15:54:38
對不起,我完全誤解了,謝謝 – Skilldrick 2010-12-09 15:55:02