Sql 对于相同但较小的SELECT查询,大型SELECT查询似乎返回不同的顺序?
我正在执行SQLite查询,以获取一组图像ID的所有图像路径。需要维护ID的顺序。如果查询5个ID,将按正确顺序返回5个路径。但是,如果我保持查询完全相同,但查询72000个ID,那么我收到的返回顺序会不同吗 为什么会这样?我已经复制并粘贴了2个查询和2个结果(显然减去完整的72000个ID和结果) 这对任何人都有意义吗 查询(带有5个ID) 结果(这是正确的!) 查询(有72000个ID) 结果(这是不正确的!为什么订单会更改? 编辑:您将如何对这两个查询进行联接?Sql 对于相同但较小的SELECT查询,大型SELECT查询似乎返回不同的顺序?,sql,sqlite,Sql,Sqlite,我正在执行SQLite查询,以获取一组图像ID的所有图像路径。需要维护ID的顺序。如果查询5个ID,将按正确顺序返回5个路径。但是,如果我保持查询完全相同,但查询72000个ID,那么我收到的返回顺序会不同吗 为什么会这样?我已经复制并粘贴了2个查询和2个结果(显然减去完整的72000个ID和结果) 这对任何人都有意义吗 查询(带有5个ID) 结果(这是正确的!) 查询(有72000个ID) 结果(这是不正确的!为什么订单会更改? 编辑:您将如何对这两个查询进行联接? "~/ImagesPath
"~/ImagesPath/36/20160818_050623_000.jpg"
"~/ImagesPath/36/20160818_050710_000.jpg"
"~/ImagesPath/36/20160818_050844_000.jpg"
"~/ImagesPath/36/20160818_050449_000.jpg"
"~/ImagesPath/36/20160818_050757_000.jpg"
etc... to 72,000
SELECT MicrosoftId FROM TagsMSCV WHERE name IN ('" + some vars + "') GROUP BY MicrosoftId ORDER BY COUNT(MicrosoftId) DESC
及
如果没有显式指定一个
orderby
子句,则无法保证返回行的顺序。数据库可以自由地以最有效的顺序返回它们。即使您碰巧按照您想要的顺序得到了结果,您也不能指望它-任何情况下(例如,重建索引,或者只是某个缓存上的一行)都可能在下次运行查询时更改顺序
TL;DR,如果您关心行的顺序,则应添加一个orderby
子句:
SELECT Path
FROM Images
WHERE MicrosoftId IN ('78003','78010','78080','78149','78196', /* etc ...*/)
ORDER BY MicrosoftId
一种解决方案是将查询组织成一个
连接
:
select * from
(
select 78003 as mid
union select 78010
union select 78080
union select 78149
union select 78196
# and so on...
) mids
inner join Images on (Images.MicrosoftId = mids.mid);
这样,查询应该使用构造的mids
表的顺序
如果您想对排序有额外的把握,可以在构造的表上附加一个排序列:
select * from
(
select 78003 as mid, 1 as midOrder
union select 78010, 2
union select 78080, 3
union select 78149, 4
union select 78196, 5
# and so on...
) mids
inner join Images on (Images.MicrosoftId = mids.mid)
order by midOrder
这个连接应该会起作用我不确定为什么查询中没有
orderby
子句。是否有具体原因?订单依据位于此之前的查询中。这与那个家伙在数据库中设置表的方式有关。我必须用ID做所有的事情,一旦我有了ID,我需要使用它们来获得我需要的路径。但是我获取ID的顺序很重要;我需要维护它。我需要的顺序就是查询的顺序。我必须在一个不同的表中找到ID的来源,然后我来到这个表来获得它们相应的路径。实现这一点的唯一方法是将两个独立的SQL语句结合起来吗?连接可能是最好的方法-它应该简化代码并可能使其更高效。这实际上将一堵代码墙变成了一行代码。我真的需要升级我的SQL游戏。非常感谢。现在要弄清楚这一切是如何运作的,哈哈。
SELECT Path FROM Images WHERE MicrosoftId IN ('" + results from above query + "')
SELECT Path
FROM Images
WHERE MicrosoftId IN ('78003','78010','78080','78149','78196', /* etc ...*/)
ORDER BY MicrosoftId
select * from
(
select 78003 as mid
union select 78010
union select 78080
union select 78149
union select 78196
# and so on...
) mids
inner join Images on (Images.MicrosoftId = mids.mid);
select * from
(
select 78003 as mid, 1 as midOrder
union select 78010, 2
union select 78080, 3
union select 78149, 4
union select 78196, 5
# and so on...
) mids
inner join Images on (Images.MicrosoftId = mids.mid)
order by midOrder
SELECT Path FROM Images i
JOIN TagsMSCV t ON i.MicrosoftId = t.MicrosoftId
WHERE t.name IN ('" + some vars + "') GROUP BY t.MicrosoftId ORDER BY
COUNT(t.MicrosoftId) DESC