我有这个查询工作正常。
我需要子类别属于公司的行
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
然后方法有问题,但在这种情况下,我想不出使用连接的替代方法。
有吗?
答案 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;