方法一
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
解释命令输出
方法二
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
解释命令输出
以上两个是相同的,恰好对我来说工作正常。唯一的区别是方法 1 查询是使用 JOIN
语句和 ON
编写的,方法 2 是使用 JOIN
速记方法编写的。
问题是方法 1 返回 3 行,方法 2 返回 1543 行。同一个查询怎么会返回不同的结果呢?
鉴于我只是想了解为什么会这样。我不关心结果集。我想知道的是,用两种方式编写的同一个查询如何输出不同类型的结果集?
最佳答案
您的问题不是 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
)
关于MySQL JOIN 与 MySQL 简写 JOIN(,),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14504502/