2016-01-31 20 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的類別,也有案件分配給他們的類別id(即不能有0個案例,如橙子類別)。

因此,在這種情況下,我的查詢將導致只有1個結果:蘋果

回答

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 JOINhttp://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

「In」可能非常緩慢。我不會在這樣一個簡單的查詢中使用它。 http://stackoverflow.com/questions/5018284/mysql-in-queries-terribly-slow-with-subquery-but-fast-with-explicit-values – Axalix

0

你需要的是INNER JOINDISTINCT

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

如果您告訴我們索引和表大小,以優化性能這將是usfull,我認爲這是rigth approach

SELECT c.Name FROM Categories c 
    INNER JOIN (SELECT DISTINCT category FROM items) i 
    ON c.id = i.category 
WHERE c.private = 1