2013-01-05 85 views
2

海蘭親愛的朋友們!我想感謝大家對像我這樣的新手的幫助和理解。這是我的第二個問題,所以請有憐憫。查詢加盟2個表(使用LIKE和準備的語句)

我想加入2個表(AUTHORS和BOOKS),以便表2中的AUTHOR_REF將成爲表1中作者的完整名稱(不是AUTHOR_REF)。 (有authors.id和books.author_ref之間的外鍵約束關係

的兩張桌子是:

**ID  LAST NAME  FIRST NAME** 
     1  Palahniuk  Chuck 
     2  Faulkner  William 
     3  Beckett  Samuel 

    **ID  TITLE    AUTHOR_REF** 
     1  Fight Club    1 
     2  Absalom, Absalom!!  2 
     3  Choke     1 
     4  Waiting for Godot  3 

CASE /問: 用戶搜索某本書在網站上。我用準備好的發言準備查詢:

$stmt = mysqli_prepare($db, "SELECT title, autor_ref FROM books WHERE title LIKE CONCAT('%', ?, '%')"); 

我知道我應該使用一些與JOIN WHERE條件類似:「authors.last_name = books.author_ref」,但我一個從第一個SELECT中已經有WHERE條件。我怎樣才能實現我的目標?

我真的很困惑。我的數據庫設計糟糕嗎?

任何幫助將衷心感謝。 問候

回答

2

不,你實際上是在正確的軌道上,你的數據庫設計正確。該JOIN將具有不與WHERE子句中屬於自己的ON條件:

SELECT 
    title, 
    `FIRST NAME`, 
    `LAST NAME` 
FROM 
    books 
    /* Join brings over the author name */ 
    JOIN authors ON books.AUTHOR_REF = authors.ID 
/* WHERE clause does not change */ 
WHERE title LIKE CONCAT('%', ?, '%') 

如果您有有一個著名的作家(AUTHOR_REF IS NULL)的書,用一個LEFT JOIN代替書標題仍以NULL作爲作者姓名返回。

SELECT 
    title, 
    `FIRST NAME`, 
    `LAST NAME` 
FROM 
    books 
    /* Left join ensures a row returned for the book even if it has no author */ 
    LEFT JOIN authors ON books.AUTHOR_REF = authors.ID 
WHERE title LIKE CONCAT('%', ?, '%') 
+0

Yey,它工作得很好。非常感謝您的幫助Micheal.Really幫助。你救了我:) – Sevrotic

+0

@Sevrotic快樂幫,歡迎堆棧溢出。 –

1

我將構建數據庫在這一個有點diferent ...

AUTHORID  LAST NAME  FIRST NAME 
    1   Palahniuk  Chuck 
    2   Faulkner  William 
    3   Beckett  Samuel 

BOOKID  TITLE    AUTHORID 
    1  Fight Club    1 
    2  Absalom, Absalom!!  2 
    3  Choke     1 
    4  Waiting for Godot  3 

然後通過加入他們的行列:

SELECT title, `FIRST NAME`,`LAST NAME` 
FROM books 
LEFT JOIN author USING (AUTHORID) 
WHERE title LIKE CONCAT('%', ?, '%') 
+0

謝謝你的幫助親愛的伊萬。我真的很感激 – Sevrotic

+0

歡迎你我的朋友,我很高興地作出貢獻。 –

0
$stmt = mysqli_prepare($db, "SELECT a.*, b.autor_ref FROM authors as a, books as b WHERE b.author_ref = a.id AND b.title LIKE '%$search%'"); 

獲取這可以顯示後完整作者的名字和更多(如該作者的更多電影)。