【问题标题】:ORDER BY on joined table连接表上的 ORDER BY
【发布时间】:2016-08-16 00:34:53
【问题描述】:

我正在尝试连接两个表,并且还按我要连接的表中的一列对查询结果进行排序。一切正常,直到我添加 ORDER BY cm.num,此时我收到此错误:

Call to a member function fetch_assoc() on boolean

这是我的完整查询:

SELECT * 
FROM course 
   JOIN cm ON (course = cm.course) 
WHERE title LIKE '%$searchTerm%' 
LIMIT $limit 
ORDER BY cm.num

大家有什么建议吗?

编辑:

根据要求提供完整代码:

function getCourses($searchTerm) {
    $mysqli = new mysqli('localhost', 'scott', 'tiger', 'courses');
    if ($mysqli->connect_errno) {
        header("HTTP/1.1 500 Internal Server Error");
        die("Failed to connect to MySQL: {$mysqli->connect_error}");
    }
    $mysqli->set_charset('utf8');

    $courses = [];
    $limit = $searchTerm == '' ? 1000 : 10;
    $res = $mysqli->query("SELECT * FROM course JOIN cm ON (course = cm.course) WHERE title LIKE '%$searchTerm%' ORDER BY cm.num LIMIT $limit");
    while($row = $res->fetch_assoc()) {
        $course = new Course(
            $row['id'],
            $row['title'],
            $row['href'],
            $row['level'],
            $row['award'],
            $row['summary'],
            $row['dept'],
            $row['subject'],
            $row['overview'],
            $row['wyl'],
            $row['careers']
        );

        array_push($courses, $course);
    }

    return $courses; 
}

【问题讨论】:

  • cm 是你的表名吗??
  • 在连接表时最好在整个查询中的每一列之前显式地写下表的名称/别名。
  • course 既是表又是表中的列?大致了解您的表格的外观和名称会有所帮助。

标签: php mysql sql


【解决方案1】:

将限制放在 order by 之后并具体指定列

JOIN cm ON (course.course = cm.course)

SELECT * 
FROM course 
   JOIN cm ON (course.course = cm.course) 
WHERE title LIKE '%$searchTerm%' 
ORDER BY cm.num
LIMIT $limit 

【讨论】:

  • 不幸的是,我试过了,但我仍然遇到同样的问题。
  • 你不认为join工作根据字段course是表JOIN cm ON (course = cm.course) '
  • 是的,我发现 @urfusion 这将是另一个问题,当 OP 弄乱 LIMIT 定位时可能会错过这个问题
  • @user3746428 查看修改后的答案,并使用更正的 JOIN。您可能会收到类似 ambiguous column name 的错误
  • @Webeng 看到这个帖子stackoverflow.com/questions/9770366/…我必须自己查一下
【解决方案2】:

您的代码中有(course = cm.course)。 course 是一个表,你想加入两列。所以应该是(course.itsColumn = cm.course)

如果有帮助,请告诉我!

【讨论】:

  • 我们真的不知道course 是否只是一个表,或者course 是否也是表中名为course 的列。这个问题很不清楚。
  • @apokryfos 我同意,虽然这是他的错字,答案应该足以帮助他注意到它,从而解决他的问题:)
【解决方案3】:

尝试添加别名。建议通过别名引用连接中的每个表。

SELECT * 
FROM course AS c
   LEFT JOIN cm AS cm ON (c.course = cm.course) 
WHERE title LIKE '%$searchTerm%' 
LIMIT $limit 
ORDER BY cm.num

【讨论】:

  • 我有点困惑.. JOIN 到底是做什么的?我知道 INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN 的作用,但是 JOIN 本身?
  • 刚刚复制了查询并将别名放在那里。你当然是对的。应该是LEFT JOIN
  • 你真的可以在 MySQL 中像这样在 ORDER BY 之前做 LIMIT 吗? (其他产品有 ORDER BY then LIMIT。)
  • @jarlh 不,那是 cb0 错过的原始问题
  • @cb0 为什么应该它是左连接? JOIN 是有效的语法,默认为INNER JOIN,但它本身是有效的语法
【解决方案4】:

您正在代码中使用自联接。那么请您检查以下代码:

SELECT * FROM course c 
JOIN course cm ON (c.course = cm.course) 
WHERE c.title LIKE '%$searchTerm%' 
ORDER BY cm.num LIMIT $limit

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 2021-12-28
    • 2017-08-09
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多