【问题标题】:How to form a query across two tables如何跨两个表形成查询
【发布时间】:2016-05-08 15:04:04
【问题描述】:

我正在努力形成一个查询以使用 LEFT JOIN 完成我需要的事情。恐怕我会走错路,所以我与社区联系。

我有两个数据库,一个用于categories,一个用于items,如下所示

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 个结果:Apple

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    如果你告诉我们索引和表大小来优化性能,那将是有用的,我认为这是正确的方法

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

    【讨论】:

      【解决方案2】:

      你需要的是INNER JOINDISTINCT

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

      【讨论】:

        【解决方案3】:

        您无法使用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/

        【讨论】:

        • "name" - 模棱两可,除了“Apples”之外,它还会打印出“Oranges”。第 4 行还有一个错字(分号)。
        • 一切。感谢您的错别字!
        【解决方案4】:

        您不需要使用 join,in 语句可以正常工作。如您所见,它会验证所需值是否在选定列表中。

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

        See it in action

        【讨论】:

        【解决方案5】:
        select c.* from
        categories c,
        (select distinct category from items) i 
        where c.id = i.category and c.private = 1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-24
          • 1970-01-01
          • 2019-08-11
          • 1970-01-01
          相关资源
          最近更新 更多