Mysql连接与排序

Mysql连接与排序,mysql,sql,Mysql,Sql,我有两个表:user和library。图书馆里有按顺序分类的书 一定方式;用户也可以选择以某种方式对其书籍进行排序。这个 两个表的结构和示例数据如下所示: 图书馆 书号位置 10 1 12 2 14 3 16 4 使用者 用户标识图书标识位置 12669 12 1 12669 102 我希望查询返回用户12669的所有书籍,按位置排序,即: 从用户中选择bookid,其中userid=12669按位置分组 返回这些已排序的图书后,它应该返回用户中不存在的其他图书ID,

我有两个表:user和library。图书馆里有按顺序分类的书 一定方式;用户也可以选择以某种方式对其书籍进行排序。这个 两个表的结构和示例数据如下所示:

图书馆 书号位置 10 1 12 2 14 3 16 4

使用者 用户标识图书标识位置 12669 12 1 12669 102

我希望查询返回用户12669的所有书籍,按位置排序,即:

从用户中选择bookid,其中userid=12669按位置分组 返回这些已排序的图书后,它应该返回用户中不存在的其他图书ID,这些ID位于库中。不应重复bookid。这些场景的结果如下所示:

十二, 10 14 十六,

换句话说:图书馆中的所有书籍都应该通过此查询返回,但是 将用户选择的图书按用户位置排序 我想我可能需要某种类型的join语句。我试过: 从用户u中选择bookid右键连接u.bookid=l.bookid上的库l,其中u.userid=12669按u.position分组
但是,我得到了一个语法错误。解决这个“问题”的最佳方法是什么?非常感谢。

这应该可以做到:

SELECT l.bookid
FROM library l
LEFT OUTER JOIN user u on u.bookid = l.bookid
WHERE u.userid = 12669
ORDER BY isnull(u.position, 99999), l.position

首先,您发布的查询在其投影中包含一个列名,该列名不属于所涉及的任何一个表

其次,您正在使用GROUPBY,其中排序是按ORDERBY执行的

第三点:正如@Romil指出的,WHERE子句中对用户表的引用覆盖了外部连接,并有效地强制了内部连接。因此,您需要从用户表的内联视图中进行选择

最后,要获得所需的排序顺序,需要首先标记所有USER.POSITIONs。此版本的查询使用IFNULL为没有关联用户记录的任何行分配极高的值。因此,它将按所有返回的USER.POSITION值进行排序,然后按LIBRARY.POSITION对所有剩余的书籍进行排序

select l.bookid 
from ( select * from user
        where userid = 12669 ) u
   right join library l 
     on (u.bookid = l.bookid) 
order by ifnull(u.position, 999999999) , l.position
注意:如果您正在编制索引,因此可能有足够的工具架来支持超过999999999个位置,只需增加该替代值即可


这对我不起作用。它并没有返回书中的图书ID 我想要的安排


坦率地说,我觉得这令人惊讶。下面是一个按指定顺序返回示例数据的函数。所以我重复我先前的问题:您发布的表描述是否与实际表完全匹配?

谢谢APC、Romil和aF。我终于找到了一个不使用联接的解决方案。 这对我很有用:

( SELECT bookid FROM user WHERE userid = 12669 ORDER BY position ) UNION ( SELECT bookid FROM library )
第一个查询从用户处选择已排序的BookID,然后union语句从库中选择其他每一本书,并将其添加到结果集中。后面这一组的排列并不重要。

嗯,这完全忽略了USER.POSITION列中的值,因此不会返回所需的输出。@APC确实如此!我添加了user.position来解决这个问题。另外,您正在使用内部联接,这意味着它只返回用户表中书籍的结果。对外部联接的需求是OP在其原始查询中正确处理的为数不多的事情之一:当用户表中包含多个userid时,这将无法按要求工作。所以,再编辑一次,您就完全复制了我的解决方案:仍然不对。将用户ID放入where子句会将外部联接转换为内部联接。在sql中,它不会返回不在用户列表中但在库中可用的bookid。我发布的查询完成了所有问题中提到的工作。@Romil-很好。我把注意力集中在排序上,而忽略了where子句的问题。当然我没有测试过。但我现在有了!这对我不起作用。它没有按照我想要的安排归还图书证。谢谢。除了表名和列名,发布的表说明与实际表完全匹配。谢谢您的帮助。我尝试了您的解决方案,我得到了错误:“字段列表”@user585566中的未知列“library.bookid”-您发布的表描述是否与实际表完全匹配?您应该在帖子中包含任何错误消息的实际内容。它使我们更容易诊断您的问题。帮助我们帮助你。这不能保证你想要的结果。文档说:对单个SELECT语句使用ORDERBY并不意味着行在最终结果中的显示顺序,因为UNION默认生成一组无序的行。。。如果ORDER BY在选择中无限制地出现,则会将其优化掉,因为它无论如何都不会产生任何效果。了解更多信息: ( SELECT bookid FROM user WHERE userid = 12669 ORDER BY position ) UNION ( SELECT bookid FROM library )