连接表上的 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
如何在具有现有 order by 的表上使用 OVER(ORDER BY())?