2013-04-09 144 views
0

我正在寫一個與MySQL數據庫交互的應用程序。多表SQL搜索查詢

我有3個表格,'類別','書籍'和'book_category'。

/* stores properties for categories */ 
`categories` (
    `id` int(11) NOT NULL auto_increment, 
    `name` varchar(140) NOT NULL UNIQUE, 
    PRIMARY KEY (`id`) 
); 


/* stores properties for books */ 
`books` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `title` int(11) NOT NULL, 
    `read` tinyint(1) NOT NULL default 0, 
    `creation_date` timestamp NOT NULL default CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
); 

/* matches books against categories */ 
`book_category` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `category_id` int(11) NOT NULL, 
    `item_id` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
); 

我有2個變量來執行搜索。

<?php 
    $categoryString = 'python'; // books saved under python 
    $readBool = 1; // all books that have been read 
?> 

我還想寫下面的SQL查詢:

選擇已閱讀所有書籍蟒(即,book.read = 1)。

我的SQL知識非常有限,請大家幫忙。

+1

in book_category table item_id是否爲外部的book表id? – 2013-04-09 10:04:59

+0

看起來像book_category.category_ID = categories.id和book_category.item_id = books.id所以一個簡單的連接或2應該這樣做:) – Dave 2013-04-09 10:06:02

+0

這是功課嗎? – 2013-04-09 10:18:05

回答

1

這應該做的伎倆:

SELECT books.id, books.title, books.`read`, categories.name 
FROM books 
INNER JOIN book_category ON books.id = book_category.item_id 
INNER JOIN categories ON book_category.category_id = categories.id 
WHERE books.read = 1 
AND categories.name = 'python' 

這裏是一個SQL fiddle證明。

+0

+1添加sql小提琴 – 2013-04-09 10:39:20

0

剛剛嘗試這個 -

select * from book_category 
    LEFT JOIN books ON book_category.item_id = books.id 
    LEFT JOIN category ON category.id = book_category.category_id 
    WHERE category.name = 'python' AND 
     book.read = 1 
0
select b.title 
from books b 
left join book_category bc on (b.id=bc.item_d) 
left join categories c on (c.id=bc.category_id) 
where b.read=1 and c.name='python' 
0
SELECT * FROM books WHERE id IN (
    SELECT item_id FROM book_category WHERE category_id IN (
     SELECT id FROM category WHERE name = 'Python' 
    ) 
) 
0
SELECT * 
FROM books AS b 
    INNER JOIN book_category AS bc 
    ON bc.item_id = b.id 
    INNER JOIN categories AS c 
    ON c.id = bc.category_id 
WHERE b.read = 1 AND c.name='python' 
+0

包括'c.name ='python''在哪裏 – 2013-04-09 10:08:44

+0

@SuhelMeman我只是要做那 – 2013-04-09 10:10:12

+0

好吧,我想你忘了提及它 – 2013-04-09 10:11:02

0
SELECT b.title 
FROM books b, categories c, book_category bc 
WHERE b.id = bc.item_id 
    AND c.id = bc.category_id 
    AND b.read 
    AND c.name = 'python' 

爲了確保您的查詢的工作速度快,確保您有以下指標:

books(id) 
categories(id, name) 
book_category(item_id) 
book_category(caregory_id) 
0

試試這個

"select b.title from category c INNER JOIN book_category bc on bc.category_id = c.id INNER JOIN book b on b.id = b.id where b.read = '1' and c.name = 'python'";