如何跨两个表形成查询

时间:2016-01-31 00:26:10

标签: mysql sql

我正在形成一个查询来使用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

问题

我需要做的是形成一个查询,该查询只会选择private = 1的CATEGORIES,并且还会将案例分配给他们的类别ID(即不能有0个案例,如Oranges类别)。

所以在这种情况下,我的查询只会得到1个结果:Apple

5 个答案:

答案 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 JOINhttp://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)

See it in action

答案 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 JOINDISTINCT

 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
相关问题