我在INNODB表中有大约20,000行称为'cards',所以FULLTEXT不是一个选项.
请考虑此表:
id | name | description
----------------------------------------------------------
1 John Smith Just some dude
2 Ted Johnson Another dude
3 Johnathan Todd This guy too
4 Susan Smith Her too
5 Sam John Bond And him
6 John Smith Same guy as num 1, another record
7 John Adams Last guy, promise
Run Code Online (Sandbox Code Playgroud)
因此,假设用户搜索"John",我希望结果集的顺序为:
7 John Adams
6 John Smith
3 Johnathan Todd
5 Sam John Bond
2 Ted Johnson
Run Code Online (Sandbox Code Playgroud)
请注意,我们只拉了一次'John Smith',我们最近参加了他的录取.由于我的数据,所有名字都是针对同一个人,不需要担心两个名叫John Smith的人.想法?如果我能澄清任何事情,请告诉我.
我读过很多SQL代码,似乎开发人员假定默认排序顺序始终存在.例如,在构建HTML选择列表时,他们只会SELECT id, name FROM table发布一个ORDER BY子句.
根据我自己的经验,似乎dbms ORDER BY总是使用FIFO命令数据,如果没有给出子句而没有索引.但是,订单无法保证.但是,如果表没有变化,我从未见过dbms重新排序数据.
如果表没有变化,您是否曾经历过以非确定性顺序选择数据的dbms?
始终放置ORDER BY子句是最佳做法吗?
Hibernate与PostgreSQL DB一起使用,同时按列对desc进行排序会使空值高于非空值.
SQL99标准提供关键字"NULLS LAST"来声明空值应该低于非空值.
使用Hibernate的Criteria API可以实现"NULLS LAST"行为吗?
我有一张桌子,我们称之为"foos",其中有近600万条记录.我正在运行以下查询:
SELECT "foos".*
FROM "foos"
INNER JOIN "bars" ON "foos".bar_id = "bars".id
WHERE (("bars".baz_id = 13266))
ORDER BY "foos"."id" DESC
LIMIT 5 OFFSET 0;
Run Code Online (Sandbox Code Playgroud)
此查询需要很长时间才能运行(Rails在运行时会超时).所有ID都有一个索引.好奇的部分是,如果我删除ORDER BY条款或LIMIT条款,它几乎是瞬间运行.
我假定这两者的存在ORDER BY和LIMIT正在做的PostgreSQL查询规划一些错误的选择.任何人都有任何想法如何解决这个问题?
如果它有帮助,这里是EXPLAIN所有3种情况:
//////// Both ORDER and LIMIT
SELECT "foos".*
FROM "foos"
INNER JOIN "bars" ON "foos".bar_id = "bars".id
WHERE (("bars".baz_id = 13266))
ORDER BY "foos"."id" DESC
LIMIT 5 OFFSET 0;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------
Limit (cost=0.00..16663.44 rows=5 width=663)
-> Nested Loop (cost=0.00..25355084.05 rows=7608 width=663) …Run Code Online (Sandbox Code Playgroud) 我有一个通用的
List<MyClass>
Run Code Online (Sandbox Code Playgroud)
where MyClass属性InvoiceNumber包含如下值:
200906/1
200906/2
..
200906/10
200906/11
200906/12
我的名单必然是一个
BindingList<T>
Run Code Online (Sandbox Code Playgroud)
支持使用linq进行排序:
protected override void ApplySortCore(
PropertyDescriptor property, ListSortDirection direction)
{
_sortProperty = property;
_sortDirection = direction;
var items = this.Items;
switch (direction)
{
case ListSortDirection.Ascending:
items = items.OrderByDescending(x => property.GetValue(x)).ToList();
break;
case ListSortDirection.Descending:
items = items.OrderByDescending(x => property.GetValue(x)).ToList();
break;
}
this.Items = items;
}
Run Code Online (Sandbox Code Playgroud)
但是默认的比较器排序(假设)如下:
200906/1
200906/10
200906/11
200906/12
200906/2
在这种情况下这是令人讨厌的.
现在我想用自己的方式IComparer<T>.它看起来像这样:
public class MyComparer : IComparer<Object>
{
public int Compare(Object stringA, Object …Run Code Online (Sandbox Code Playgroud) 我的表中有一个varchar字段,我想对它进行排序.但我需要将此字段作为整数处理.意思是如果排序为文本,顺序是"19,2,20",但我想得到正确的顺序"2,19,20".
谁能帮我?
我想要一个订购的子对象(这里是cat-kitten示例)的集合.并继续增加新元素的顺序.
@Entity
public class Cat {
@OneToMany(mappedBy = "cat", cascade = CascadeType.ALL)
@OrderBy("name ASC")
private List<Kitten> kittens;
public void setKittens(List<Kitten> kittens) { this.kittens = kittens; }
public List<Kitten> getKittens() { return kittens; }
}
Run Code Online (Sandbox Code Playgroud)
当我这样做时cat.getKittens.add(newKitten),名称将被打破.
是否有可能让hibernate完成保持集合总是有序的工作?通过使用@Sort hibernate注释?
@Sort的缺点在于它迫使你实现Comparable接口......什么是正确的'纯JPA'方法呢?将所有内容保存到数据库并重新加载?合并@ OrderBy和@Sort是否合理?
到目前为止,更新解决方案是将@OrderBy和@Sort结合起来.@OrderBy导致ORDER BY生成的SQL中的一个子句更好的性能(我假设java在插入到已排序的容器时再次"排序",但是这应该快得多,因为元素已经排序了)@Sort with an an实现的Comparable接口导致始终排序的容器.请注意,我现在使用SortedSet而不是List.这里更新的代码:
@Entity
public class Cat {
@OneToMany(mappedBy = "cat", cascade = CascadeType.ALL)
@OrderBy("name ASC")
@Sort(type = SortType.NATURAL)
private SortedSet<Kitten> kittens;
public void setKittens(SortedSet<Kitten> …Run Code Online (Sandbox Code Playgroud) 我有一个表:"ID name c_counts f_counts"
我想订购所有的记录,sum(c_counts+f_counts)
但这不起作用:
SELECT * FROM table ORDER BY sum(c_counts+f_counts) LIMIT 20;
假设我们使用关键字执行搜索:keyword1,keyword2,keyword3
数据库中有"name"列的记录:
1: John Doe 2: Samuel Doe 3: John Smith 4: Anna Smith
现在查询:
SELECT * FROM users WHERE (name LIKE "%John%" OR name LIKE "%Doe%")
Run Code Online (Sandbox Code Playgroud)
它将选择记录:1,2,3(按此顺序),但我想在示例中按关键字排序,keyword1=John, keyword2=Doe
所以它应该按关键字列出:1,3,2(因为我想在之后搜索"Doe"寻找"约翰")
我在考虑SELECT DISTINCT FROM (...... UNION .....)
但是以某种方式以另一种方式订购它会更容易(真正的查询真的很长)
是否有任何技巧来创建这样的订单?