2013-04-09 3 views
0

Я пишу приложение, которое взаимодействует с базой данных MySQL.Запрос на поиск по нескольким таблицам SQL

У меня есть 3 таблицы, 'категории', 'books' и '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

в таблице book_category item_id является чужой для идентификатора таблицы книг? –

+0

выглядит как book_category.category_ID = categories.id и book_category.item_id = books.id, поэтому простое соединение или 2 должны сделать это :) – Dave

+0

Это домашнее задание? –

ответ

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 –

0

Просто попробуйте this-

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'' где –

+0

@SuhelMeman я просто собирался сделать это –

+0

ok, i думаю, ты забыл упомянуть об этом –

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'"; 
Смежные вопросы