2016-01-31 4 views
3

Я изо всех сил пытаюсь сформировать запрос, чтобы выполнить то, что мне нужно, используя LEFT JOIN. Боюсь, что я поступил неправильно, поэтому я обращаюсь к сообществу.Как сформировать запрос по двум таблицам

У меня есть две базы данных, один для категорий и один для элементов следующим

CATEGORIES 
id  name   private 
1  Apples  1 
2  Oranges  1 
3  Grapes  0 


ITEMS 
id  name   category 
1  Mcintosh  1 
2  Fuji   1 
3  Green   3 

Вопрос

Что мне нужно сделать, это сформировать запрос, который будет выбрать только КАТЕГОРИИ, которые являются частными = 1 и которые также имеют случаи, присвоенные их идентификатору категории (т. е. не могут иметь 0 случаев, таких как категория апельсинов).

Так что в этом случае мой запрос приведет только 1 результат: Apple

ответ

0
select c.* from 
categories c, 
(select distinct category from items) i 
where c.id = i.category and c.private = 1 
0

Вы не можете выполнить то, что вы просите с LEFT JOIN. Чтобы избавиться от категорий, которые не имеют каких-либо явлений в них, вам нужно INNER JOIN:

SELECT DISTINCT(c.name) 
FROM categories c 
INNER JOIN items i 
ON c.id = i.category 
WHERE c.private = 1; 

Вот рабочий пример: http://sqlfiddle.com/#!9/9f15f/5

Здесь у вас есть очень хорошее объяснение JOINS в SQL и почему то, что вам нужно, это INNER JOIN: http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/

+1

«имя» - неоднозначное, также оно будет печатать «Апельсины» в дополнение к «Яблоки». Также есть строка (точка с запятой) в строке # 4. – Axalix

+1

Все. Спасибо за опечатки! – barbarity

0

Вам не нужно использовать соединение, инструкция in будет работать нормально. Как вы можете видеть, это проверяет, находится ли желаемое значение в выбранном списке.

SELECT * FROM CATEGORIES WHERE private = 1 and id in (select distinct category from items) 

See it in action

+0

«В» может быть очень медленно. Я бы не использовал его в таком простом запросе. http://stackoverflow.com/questions/5018284/mysql-in-queries-terribly-slow-with-subquery-but-fast-with-explicit-values – Axalix

0

Что вам нужно INNER JOIN и DISTINCT

SELECT DISTINCT name FROM CATEGORIES 
INNER JOIN ITEMS ON CATEGORIES.id=ITEMS.category 
WHERE CATEGORIES.private=1 
0

Это будет usfull, если вы сообщите нам индекса и таблицы размеров для оптимизации производительности, я думаю, что это ориентировочный подход

SELECT c.Name FROM Categories c 
    INNER JOIN (SELECT DISTINCT category FROM items) i 
    ON c.id = i.category 
WHERE c.private = 1 
Смежные вопросы