2013-04-09 146 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'";