我正在形成一个查询来使用LEFT JOIN来完成我需要的东西。我担心我会以错误的方式解决这个问题,所以我联系了社区。 p>
我有两个数据库,一个用于类别,另一个用于项目,如下所示
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
问题
我需要做的是形成一个查询,该查询只会选择private = 1的CATEGORIES,并且还会将案例分配给他们的类别ID(即不能有0个案例,如Oranges类别)。
所以在这种情况下,我的查询只会得到1个结果:Apple
答案 0 :(得分: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
在这里,您对SQL中的JOINS
有一个非常好的解释,为什么您需要的是INNER JOIN
:http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/
答案 1 :(得分:0)
您不需要使用join,in
语句也可以正常工作。如您所见,它会验证所需的值是否在选定列表中。
SELECT * FROM CATEGORIES WHERE private = 1 and id in (select distinct category from items)
答案 2 :(得分:0)
select c.* from
categories c,
(select distinct category from items) i
where c.id = i.category and c.private = 1
答案 3 :(得分:0)
您需要的是INNER JOIN
和DISTINCT
SELECT DISTINCT name FROM CATEGORIES
INNER JOIN ITEMS ON CATEGORIES.id=ITEMS.category
WHERE CATEGORIES.private=1
答案 4 :(得分:0)
如果您告诉我们索引和表格大小以优化性能,那将是非常有用的,我认为这是一种严谨的方法
SELECT c.Name FROM Categories c
INNER JOIN (SELECT DISTINCT category FROM items) i
ON c.id = i.category
WHERE c.private = 1