MySQL JOIN 与 MySQL 简写 JOIN(,)

标签 mysql sql database phpmyadmin

方法一

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

解释命令输出

enter image description here

方法二

 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 

解释命令输出

enter image description here

以上两个是相同的,恰好对我来说工作正常。唯一的区别是方法 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/

相关文章:

PHP 重定向 header

mysql - 第一范式数据库规范化

mysql - ruby mysql 连接错误

sql - PL/SQL -- 变量 "must be a type"编译错误

mysql - 检查 MySQL 表是否存在而不使用 "select from"语法?

java - 在 SQL 表中设置日期格式 dd/mm/yyyy

mysql - 可选用户设置应该延迟初始化到数据库中还是始终使用新注册创建?

java - 矫枉过正还是适当?

java - 连接到服务器上的数据库

mysql - 如何删除mysql中两个单词之间的空格