使用连接的替代语法
问题描述:
我有这个查询哪些工作正常。使用连接的替代语法
我所需要的行,其中所述子类别属于公司
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开始
那么方法有问题,但在这种情况下,我想不出使用连接的替代方案。
有没有?
答
我会写的查询是这样的:
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条件将满足条件,那么没有理由做更多的检查。
你是什么意思“有什么问题的方法”?你的意思是在性能方面? – enigma 2014-10-31 17:01:40
我没有看到任何问题及其逻辑。你可以尝试使用存在的逻辑来减少锁定 – Jaylen 2014-10-31 17:02:50
你使用的逻辑看起来很好。你可以使用显式的“OUTER JOIN”替换隐式的外连接(你的逗号)。用INNER JOIN构建这个可能会非常难看。可以对同一个表进行多次命中,也可以在两次选择之间使用UNION,其中一个使用INNER JOIN,另一个使用OUTER。 – JNevill 2014-10-31 17:05:14