连接表上的 ORDER BY

Posted

技术标签:

【中文标题】连接表上的 ORDER BY【英文标题】:ORDER BY on joined table 【发布时间】: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 既是表又是表中的列?大致了解您的表格的外观和名称会有所帮助。 【参考方案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 看到这个帖子***.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

【讨论】:

以上是关于连接表上的 ORDER BY的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy - 连接表的关系上的 order_by

多对多关系连接表上的sails.js 额外字段

如何在具有现有 order by 的表上使用 OVER(ORDER BY())?

Sequelize GROUP BY 仅在主表上聚合,而不是连接中的完整连接表

MySQL Order By 减慢连接速度

在连接中使用 Where 子句,以及 Group by 和 Order By