2010-07-19 49 views
0

我有用於存儲圖書信息3個表:與MySQL查詢中使用掙扎加入

books 
----- 
id 
title 

authors 
------- 
id 
name 

books_to_authors 
---------------- 
book_id 
author_id 

當顯示一本書的信息,然後,我希望能夠通過同一作者可以選擇任何其他的書。

我有第一個查詢中可用的當前書籍ID,但我無法弄清楚從哪裏開始實現我所需要的,因爲可以有多個作者。很明顯,其中只有一個會很簡單,所以我真的很困難。任何幫助將非常感激!

回答

1

我認爲這樣做可以。只需將?替換爲他們當前正在查看的書籍ID,這將爲您提供同一作者的所有書籍。

SELECT b.* 
FROM books b 
INNER JOIN books_to_authors b2a ON b2a.book_id = b.id 
WHERE b2a.author_id IN (
    SELECT author_id FROM books_to_authors WHERE book_id = ? 
) 

如果要排除他們正在查看這本書,你可以改變這樣的查詢:

SELECT b.* 
FROM books b 
INNER JOIN books_to_authors b2a ON b2a.book_id = b.id 
WHERE b2a.author_id IN (
    SELECT author_id FROM books_to_authors WHERE book_id = ? 
) 
AND b.id <> ? 
0
$book_id = (your code for retrieving book_id);  

$db_query = "SELECT b.* 
FROM books b 
INNER JOIN books_to_authors bta ON bta.book_id = b.id 
WHERE bta.author_id IN (
    SELECT author_id FROM books_to_authors WHERE book_id = ".$book_id." 
)"; 

我假設你正在使用PHP。如果我錯了,只是使用SQL查詢字符串,並忽略其餘的...

0

您正在尋找下面的查詢。我看到一些使用子查詢的解決方案,我強烈建議不要使用子查詢。他們是不是運行2個查詢慢:

  1. 具有書IDSELECT author_id FROM books_to_authors WHERE book_id = '{$book_id}'
  2. 獲取作者ID然後運行這個命令:

    SELECT books.id, books.title, authors.name FROM books RIGHT JOIN books_to_authors ON books_to_authors.book_id = books.id) RIGHT JOIN authors ON (authors.id = books_to_authors.author_id) WHERE authors.id = '{$author_id}'

+0

除一本書可以有多個作者 – 2010-07-19 13:25:23

+0

這也不是問題,在第二章ond查詢,'WHERE authors.id IN(「.implode(',',$ authorsIdArray)。」)'它執行這項工作 – 2010-07-19 13:26:38