Tec*_*hie 7 mysql sql database phpmyadmin
方法1
SELECT o.*,
bc.*,
s.name AS plan_name,
p.image AS course_image,
p.id AS course_id,
p.name AS course_name,
p.id,
p.level
FROM wg_guru_order o
JOIN wg_guru_buy_courses bc
ON o.id = bc.order_id
JOIN wg_guru_subplan s
ON bc.plan_id = s.id
JOIN wg_guru_program p
ON bc.course_id = p.id
WHERE o.status = 'Paid'
AND bc.userid = 451
OR p.catid = 26
AND p.published = 1
Run Code Online (Sandbox Code Playgroud)
EXPLAIN命令输出

方法2
SELECT o.*,
bc.*,
s.name AS plan_name,
p.image AS course_image,
p.id AS course_id,
p.name AS course_name,
p.id,
p.level
FROM wg_guru_order o,
wg_guru_buy_courses bc,
wg_guru_subplan s,
wg_guru_program p
WHERE o.status = 'Paid'
AND o.id = bc.order_id
AND bc.userid = 451
AND bc.plan_id = s.id
AND bc.course_id = p.id
OR p.catid = 26
AND p.published = 1
Run Code Online (Sandbox Code Playgroud)
EXPLAIN命令输出
以上两个是相同的,恰好对我来说工作正常.唯一的区别是方法1查询是使用JOINclaues 编写的ON,方法2是使用JOIN速记方法编写的.
问题是方法1返回3行,方法2返回1543行.相同的查询如何返回不同的结果?
鉴于我只想了解它为什么.我不关心结果集.我想知道的是,以两种方式编写的相同查询如何输出不同类型的结果集?
sge*_*des 11
你的问题不是CROSS JOIN和INNER JOIN,而是你的WHERE标准需要围绕相应的OR子句括号.
在方法2应该具有WHERE这样的条款,以等同于方法1:
WHERE ( o.id = bc.order_id
AND bc.plan_id = s.id
AND bc.course_id = p.id
)
AND ( o.status = 'Paid' AND bc.userid = 451
OR p.catid = 26 AND p.published = 1
)
Run Code Online (Sandbox Code Playgroud)
总是喜欢第一个选择。
这两个选项都是标准选项,但第二个选项来自较旧的 SQL-89 标准。第一个选项是新的 SQL-92 标准。旧的标准已被弃用,并且一些数据库开始遵循该弃用。例如,Sql Server 2012 不再支持通过旧语法执行外连接。它仍然受到 MySQL 的完全支持,但您不应该真正指望它在应用程序的生命周期中保持这种状态。
除此之外,这些并不是相同的查询。您需要在 WHERE 子句中添加一些括号来控制OR条件的解释方式。这就是查询返回不同行集的原因。正如所写,你的 where 子句看起来像这样:
方法一:
WHERE (o.status = 'Paid' AND bc.userid = 451)
OR (p.catid = 26 AND p.published = 1)
Run Code Online (Sandbox Code Playgroud)
方法二:
WHERE
(o.status = 'Paid'
AND o.id = bc.order_id
AND bc.userid = 451
AND bc.plan_id = s.id
AND bc.course_id = p.id
) OR ( p.catid = 26 AND p.published = 1)
Run Code Online (Sandbox Code Playgroud)
请注意分组...这可能不是您想要的。我希望你的意图更像是这样的:
WHERE o.status = 'Paid'
AND o.id = bc.order_id
AND bc.course_id = p.id
AND bc.plan_id = s.id
AND (bc.userid = 451 OR p.catid = 26)
AND p.published = 1
Run Code Online (Sandbox Code Playgroud)
现在,您的两个查询都无法以这种方式工作,但我认为这更接近您真正想要做的事情。您需要在正确的位置编写带有括号的查询以获得您想要的结果。