使用连接的替代语法

问题描述:

我有这个查询哪些工作正常。使用连接的替代语法

我所需要的行,其中所述子类别属于公司

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 
0123开始

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

有没有?

+0

你是什么意思“有什么问题的方法”?你的意思是在性能方面? – enigma 2014-10-31 17:01:40

+0

我没有看到任何问题及其逻辑。你可以尝试使用存在的逻辑来减少锁定 – Jaylen 2014-10-31 17:02:50

+0

你使用的逻辑看起来很好。你可以使用显式的“OUTER JOIN”替换隐式的外连接(你的逗号)。用INNER JOIN构建这个可能会非常难看。可以对同一个表进行多次命中,也可以在两次选择之间使用UNION,其中一个使用INNER JOIN,另一个使用OUTER。 – JNevill 2014-10-31 17:05:14

我会写的查询是这样的:

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; 
+0

这就是我一直在寻找的!我没有谈及使用条件的'ON'子句 – andrew 2014-10-31 17:15:35

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

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

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

这是使用子查询的一种语法。这个查询可能会更快一些,如果表格很大(不确定是否需要测试它),它也会减少行锁定,也可以确定这个关系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不会每次执行子查询,除非company = 0,因为company = 66条件将满足条件,那么没有理由做更多的检查。

+0

从你的答案听起来像原来是好的?如果你看到我的评论谜以上可能会使问题的原因更清楚。我会给你的建议尝试 – andrew 2014-10-31 17:13:49

+0

这很好,谢谢,但+1 – andrew 2014-10-31 17:20:46

+0

好吧。我建议你使用我的第一个查询,因为我在我的回答中提到的原因 – Jaylen 2014-10-31 17:22:23