使用join的替代语法

时间:2014-10-31 16:51:35

标签: mysql join

我有这个查询工作正常。

我需要子类别属于公司的行

OR

公司可以访问默认子类别(c.plannerdefaults = 1),子类别是默认子类别(s.company = 0)

SELECT distinct 
       s.category from planner_subcat s, company c
             where 
               (
                 c.id = 66
                 and c.plannerdefaults = 1
                 and s.company = 0
                )
              or s.company = 66

问题是,也许我的想法在这里错了,我得到的印象是,如果查询以

开头
select col from table1, table2

然后方法有问题,但在这种情况下,我想不出使用连接的替代方法。

有吗?

2 个答案:

答案 0 :(得分:1)

我不确定你的目标是什么。

为什么要重新编写查询,是否看到了性能问题?

如果您正在寻找替代语法。

这是使用子查询的一种语法。这个查询可能会更快一点,如果表格很大,它会减少行锁(不确定你是否需要测试它)也是这个关系1计划者到多人的公司然后你不需要DISTINCT函数,除非它是一个不同的关系,然后将其添加回来

SELECT s.category 
FROM planner_subcat AS s
WHERE s.company IN(66,0) AND (
s.company = 66 OR EXISTS (SELECT 1 FROM company AS c WHERE id = 66 AND plannerdefaults = 1 AND s.company = 0 AND company = s.company )
)

如果您只是希望查询只有更新的语法,那么试试这个

SELECT DISTINCT s.category 
FROM planner_subcat AS s
INNER JOIN company AS c ON c.company = s.company
WHERE s.company IN(0,66) AND ( s.company = 66 OR ( c.id = 66 AND c.plannerdefaults = 1 AND s.company = 0 ) )

但我认为我的第一个查询会更好,因为你不再需要使用DISTINCT了。我认为MySQL不会每次执行子查询,除非公司= 0,因为公司= 66条件将满足条件,那么没有理由做更多的检查。

答案 1 :(得分:1)

我会用这种方式编写查询:

SELECT s.category
FROM company c
JOIN planner_subcat s
  ON c.id = s.company OR (c.plannerdefaults = 1 AND s.company = 0)
WHERE c.id = 66;