标签: like

在CMS中集成MySql全文搜索

我正在开发自己的 CMS 并使用 MySql v5.5 DB 来保存内容项记录。

由于技术限制,我无法将我的数据库升级到支持 InnoDB 表全文搜索的较新版本。

当“真实”数据保存在InnoDB存储引擎中时,使用MyISAM表进行文本搜索是否是一个好习惯?

例子:

  1. 用户创建内容项并将其保存到数据库
  2. 所有内容项字段都保存到InnoDB表中。
  3. 所有文本字段都堆叠在一起并保存在MyISAM表内的单个字段中,该表还包括参考原始内容项的附加 ID 字段。

当用户执行基于文本的搜索时,我将使用全文搜索查询对MyISAM表进行查询,该查询将为我提供对InnoDB表中所有匹配记录的引用。

底线 - 这被认为是一个很好的解决方案,性能方面和提高我的 CMS 的搜索能力,还是我应该坚持使用旧的LIKE运算符并仅使用 InnoDB 表进行查询?

mysql innodb myisam full-text-search like

5
推荐指数
1
解决办法
527
查看次数

MySQL group by like 语句?

我需要从我们的 MySQL-DB 中获取一些统计信息,并想知道是否有更快的方法来做到这一点。

基本上,在按属性进行分隔之前,我需要有关任何给定月份的用户注册信息。

例如:

SELECT count(*) AS c  
FROM `users` 
WHERE `date_created` LIKE '2015-10%' 
  AND `country` = 'DE'
Run Code Online (Sandbox Code Playgroud)

这将返回 2015 年 10 月的数字。如何更改此语句以在一个语句中返回所有月份的结果?

我也有兴趣添加类似AND confirmed = 1单独的结果。

仅使用一个 MySQL 语句就可以做到这一点吗?

mysql group-by like

5
推荐指数
2
解决办法
3677
查看次数

使用 LIKE 的 StartsWith 查询在非 ascii 列上返回错误的结果

我想查询以特定文本片段开头的条目的表。

我的印象是 LIKE 运算符是执行此操作的一种方法,因此如果我想查找具有以“a”开头的 Column2 的所有行,那么我将使用如下查询来执行此操作

SELECT Column1, Column2, Column3
FROM Table1
WHERE Column2 LIKE 'a%';
Run Code Online (Sandbox Code Playgroud)

我发现使用这样的查询会返回意外的结果。

下面是一个例子:

CREATE DATABASE TestDB;
GO

USE TestDB;
GO

CREATE TABLE TestTable
(
    Id INT NOT NULL,
    Romanian NVARCHAR(MAX) COLLATE SQL_Romanian_CP1250_CI_AS NOT NULL,
    English  NVARCHAR(MAX) NOT NULL
);
GO

SET NOCOUNT ON;

INSERT TestTable SELECT 1, N'da', 'yes';
INSERT TestTable SELECT 2, N'ani', 'years';
INSERT TestTable SELECT 3, N'a avea', 'to have';
INSERT TestTable SELECT 4, N'a fi', 'to be';
INSERT TestTable SELECT 5, …
Run Code Online (Sandbox Code Playgroud)

sql-server collation like

5
推荐指数
1
解决办法
345
查看次数

错误:运算符不存在:text[] ~~ text

我们有一个简单的语法,允许我们查看单个标量的数组,

SELECT 'foo' = ANY(ARRAY['foo', 'bar', 'baz']);
Run Code Online (Sandbox Code Playgroud)

我们可以用同样的方法来匹配 LIKE

SELECT 'foobar' LIKE ANY(ARRAY['foo%', 'bar%', 'baz%'];
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果你想做另一个。

SELECT ANY(ARRAY['foobar', 'barbar', 'bazbar']) LIKE 'foo%' 
ERROR:  syntax error at or near "ANY"
LINE 1: SELECT ANY(ARRAY['foobar', 'barbar', 'bazbar']) LIKE 'foo%';
Run Code Online (Sandbox Code Playgroud)

我知道语法不起作用,但我希望它起作用。

# SELECT ARRAY['foobar', 'barbar', 'bazbar'] LIKE 'foo%';
ERROR:  operator does not exist: text[] ~~ unknown
LINE 1: SELECT ARRAY['foobar', 'barbar', 'bazbar'] LIKE 'foo%';
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
Run Code Online (Sandbox Code Playgroud)

我想过滤一个数组以查看元素是否存在。这可能不使用 …

postgresql array operator like string-searching

5
推荐指数
1
解决办法
1万
查看次数

在扩展事件过滤器上使用方括号

我想创建一个扩展事件会话,并使用like_i_sql_unicode_string运算符过滤短语[demo],并使用方括号。我从以下开始:

CREATE EVENT SESSION [demo] ON SERVER 
ADD EVENT sqlserver.sql_batch_completed(
    WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%[demo]%'))
)
ADD TARGET package0.ring_buffer
alter event session [demo] on server state=start
Run Code Online (Sandbox Code Playgroud)

但这会解释[demo]为类似正则表达式的语法上的字符组。所以如果我运行这个:

-- m
Run Code Online (Sandbox Code Playgroud)

它将在扩展事件中捕获。

我得到的最接近的是稍后过滤它,使用[sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%demo%')过滤器然后:

SELECT
n.ev.value('@timestamp','datetimeoffset') as [timestamp],
n.ev.value('data[@name="batch_text"][1]','varchar(max)')  as [batch_text]
FROM sys.dm_xe_session_targets xet
INNER JOIN sys.dm_xe_sessions xe ON xe.[address] = xet.event_session_address
cross apply (select CONVERT(XML, target_data) as xData ) as x
cross apply x.xData.nodes(N'RingBufferTarget/event') AS n(ev)
WHERE xe.name = N'demo' AND xet.target_name = N'ring_buffer'
and n.ev.value('data[@name="batch_text"][1]','varchar(max)') like …
Run Code Online (Sandbox Code Playgroud)

sql-server syntax extended-events operator like

5
推荐指数
1
解决办法
556
查看次数

SQL Server LIKE 查询的基数估计

我在名为 AspNetUsers 的表的 LastName 列上创建了非聚集索引的统计直方图向量。

在此输入图像描述

如果我运行查询,因为SELECT * FROM dbo.AspNetUsers WHERE LastName = 'Baker'它返回 6 行作为估计行,因为Baker是步骤之一的RANGE_HI_KEY ,因此 EQ_ROWS 值是我的估计行数。同样,如果我运行查询SELECT * FROM dbo.AspNetUsers WHERE LastName = 'Bacilia',它会返回 1 行作为估计行,导致Bacilia落入“Baker”步长范围,因此该步长的AVG_RAGE_ROWS值是我的估计行数。

同样,根据我的理解,如果我执行查询,因为SELECT * FROM dbo.AspNetUsers WHERE LastName LIKE 'Ba%'它匹配 2 个步骤(BakerBatagoda),所以它应该返回 27 + 51 (RANGE_ROWS) + 6 + 4 (EQ_ROWS) = 88。但它返回 99 行作为估计。

此基数估计如何与 LIKE 查询一起使用?在执行 LIKE 查询时,它是否使用不同的公式来估计行数?

sql-server like cardinality-estimates sql-server-2017

5
推荐指数
1
解决办法
286
查看次数

在 LIKE 中重复模式 X 次

我查看了 Microsoft 的模式文档(可以在此处找到),据我所知,它并没有说明模式重复有限次数的方法。它要么是通配符(无限期地继续),要么是在一个位置查找特定字符,每个位置都是独立输入的。有没有办法输入“模式 X 重复 Y 次”?

例如,如果我想查找正好有 5 位数字的帐号,我现在拥有的是:

SELECT * FROM table WHERE account LIKE '[0-9][0-9][0-9][0-9][0-9]'
Run Code Online (Sandbox Code Playgroud)

有没有速记的方法来做到这一点?

sql-server pattern-matching like regex

4
推荐指数
1
解决办法
3510
查看次数

mysql - 按 where 子句中的第一个条件排序

我有一个表由以下字段组成

id, name
Run Code Online (Sandbox Code Playgroud)

具有以下值

1, ciro
2, test ciro
3, ciprox
4, other
5, other
Run Code Online (Sandbox Code Playgroud)

我想获得所有以“ci”开头或包含“ci”的值,但在它们以ci开头然后其余部分之前向我显示结果。

查询

select * FROM table WHERE name like 'ci%' or name like '%ci%' order by name;
Run Code Online (Sandbox Code Playgroud)

我回来了

1, ciro
2, test ciro
3, ciprox
Run Code Online (Sandbox Code Playgroud)

我想要

1, ciro
3, ciprox
2, test ciro
Run Code Online (Sandbox Code Playgroud)

因此在名称以“ci”开头的行之前,然后是那些包含

有没有办法不使用两个查询来获得结果?

mysql order-by like

3
推荐指数
1
解决办法
2万
查看次数

MySQL 不对 INT 字段的无通配符查询使用索引 - 为什么?

所以我有一个有两个索引的表,一个在 VARCHAR 字段 (url) 上,一个在 INT 字段 (id) 上。如果我使用带有通常 = 的 WHERE 条件对这些字段中的任何一个进行查询,则在这两种情况下都使用索引。但是对于 LIKE 查询,以下使用索引:

SELECT * FROM user WHERE url LIKE 'somevalue';
Run Code Online (Sandbox Code Playgroud)

但这个没有:

SELECT * FROM user WHERE id LIKE 1;
Run Code Online (Sandbox Code Playgroud)

文档中是否有对此的解释,或者有没有人知道为什么会这样?

mysql like

3
推荐指数
1
解决办法
959
查看次数

T-SQL LIKE 谓词无法与 XML 转换的 varchar 中的空格匹配

最近,我尝试通过将XML数据转换为特定模式来搜索特定模式,varchar(max)尽管我知道这不是最佳实践,并且发现它没有按预期工作:-

设置

declare @container table(
    [Response] xml not null
);

declare @xml xml =
'<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://abc.com/xsd" xmlns:ns="http://abc.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Header>
     <ns:MessageHeader>
       <xsd:ID>ABC</xsd:ID>
       <xsd:Date>2018-12-31T23:59:59</xsd:Date>
     </ns:MessageHeader>
   </soapenv:Header>
   <soapenv:Body>
     <ns:MessageResponse>
       <ns:return>
         <xsd:ResponseList xsi:nil="true" />
       </ns:return>
     </ns:MessageResponse>
   </soapenv:Body>
 </soapenv:Envelope>';

insert into @container values (@xml);
Run Code Online (Sandbox Code Playgroud)

此查询有效

select *
  from @container
 where cast(Response as varchar(max))
  like '%<xsd:ResponseList xsi:nil="true"%';
Run Code Online (Sandbox Code Playgroud)

注意通配符在 XML 节点之前的3 个字符(即结束' />'

但这不是

select *
  from @container
 where cast(Response as varchar(max))
  like '%<xsd:ResponseList xsi:nil="true" %' -- …
Run Code Online (Sandbox Code Playgroud)

xml sql-server t-sql like string-searching

3
推荐指数
1
解决办法
288
查看次数

选择带有 % 的列

如何选择所有带有%in 的记录?我认为这段代码不起作用。

SELECT column1, column2 FROM table WHERE column1 LIKE '%%%'
Run Code Online (Sandbox Code Playgroud)
  • 第一个和最后一个%零、一个或多个字符
  • 第二个%皮肤百分比

谁能建议我它是如何工作的?我使用 MS-SQL 服务器。

提前致谢

sql-server select like

0
推荐指数
1
解决办法
80
查看次数

LIKE 条件的隐式排序是什么?

我想知道LIKE运算符是如何分类的,我有一个查询,其中有许多链式LIKE语句。以下结果在返回时如何优先排序?

AND (
  ic.COLUMN_NAME like '%Address%'
  OR ic.COLUMN_NAME like '%Email%' 
  OR ic.COLUMN_NAME like '%Phone%' 
  OR ic.COLUMN_NAME like '%Bank%'
  OR ic.COLUMN_NAME like '%Number%'
  OR ic.COLUMN_NAME like '%NAME%'   
  OR ic.COLUMN_NAME like '%Postcode%'   
Run Code Online (Sandbox Code Playgroud)

只是为了补充说明,因为我认为有些人可能没有完全理解我的问题,我将举一个例子:

假设我正在寻找地址(而不是电子邮件)并且我使用以下语句:

select * from INFORMATION_SCHEMA.COLUMNS IC
    where ic.COLUMN_NAME like '%Address%' 
Run Code Online (Sandbox Code Playgroud)

这是我要回来的:

在此处输入图片说明

我用下面的代码做同样的事情:

select * from INFORMATION_SCHEMA.COLUMNS IC
    where ic.COLUMN_NAME like '%Email%' 
    --OR ic.COLUMN_NAME like '%Email%'
Run Code Online (Sandbox Code Playgroud)

然后我得到这个:

在此处输入图片说明

这意味着在第一种情况下,我将取回地址和电子邮件地址。我知道它们只是字符串,但是我如何才能搜索地址而不取回电子邮件地址,例如email_address1address_email1web_Address_email等。我不想使用 ,where Column_Name = 'Address'因为这意味着我会错过不同的名称,例如地址 1地址 2

sql-server like

-2
推荐指数
1
解决办法
181
查看次数