给定一个查询,其中我在一个表中根据与另一个表的匹配情况查找“name”字段,如何将匹配项保留在长度最长的第一个表中?我知道 Max(Char_Length)
可能是找到最长的但不确定如何归还的方法:
http://sqlfiddle.com/#!9/2b8b7fa/3号
Select ID,T1.Name from ShortNames T1
Inner Join LongNames T2
On T2.Name Like Concat('% ', T1.Name)
or T2.Name like Concat(T1.Name,' %')
4条答案
按热度按时间at0kjp5o1#
如果需要所有列,可以在子选择的where中检查最大长度
7nbnzgx92#
这是每个组最大n个问题的一个变体,这个问题在堆栈溢出时经常被问到。
有一种方法可以解决这个问题:
说明:对另一个名称比t2长的行t3使用外部联接。如果没有找到,那么t2必须是名称最长的。
不幸的是,如果存在联系,这将返回多个结果。
在mysql 8.0中,它们支持窗口函数和CTE,所以这个问题可以用另一种方法解决(我还没有测试过这个):
即使出现平局,也不会返回多个结果。
第三种解决方案是在shortnames表中保留一列,该列引用longnames中的首选行。
填充该列后,可以执行更简单的联接:
它将以比您的查询更好的性能运行
LIKE
模式匹配。ijnw1ujt3#
如您所述,您可以使用max函数:
uinbv5nw4#
我讨厌回答我自己的问题:|但这似乎起到了预期的作用:
http://sqlfiddle.com/#!9/2b8b7fa/13号
Select T2.ID,T1.Name from ShortNames T1 Inner Join LongNames T2 On T2.Name Like Concat('% ', T1.Name) or T2.Name like Concat(T1.Name,' %') Group by T2.ID Order by Max(Char_Length(T1.Name))