如何使用like来自两个不同表的运算符执行 SQL 查询?
我需要类似的东西:
select * from table1 where name like %table2.name
Run Code Online (Sandbox Code Playgroud)
它不是一个公共字段,而是另一个表上一个字段的子字符串。
假设我们有以下代码(用于某种搜索或类似):
$stmt = $pdo->prepare("SELECT * FROM users WHERE username LIKE ?");
$stmt->execute(array('%' . $username . '%'));
Run Code Online (Sandbox Code Playgroud)
提供的用户名已正确转义,但字符%(= 0 或更多任意字符)和_(= 恰好 1 个任意字符)被 MySQL 解释为通配符。
我知道用户可以输入%或 the_进行搜索,如果我希望搜索功能正常工作,我应该转义它。(在类似的情况下set_pt并获得setopt结果)。
但我的问题是:有人可以利用这个吗?如果是,那么有人会如何利用这一点以及如何防止它?下面的功能够用吗?
function escape_like_string($str) {
return str_replace(Array('%', '_'), Array('\%', '\_'), $str);
}
Run Code Online (Sandbox Code Playgroud)
我能想到的一种可能性是输入大量的%,因此服务器需要分配大量内存。这行得通吗?
给定一个搜索字符串,我需要选择每条记录(在执行搜索的字段中)至少有一个以给定文本开头的单词。
例如:
'John Doe'
Run Code Online (Sandbox Code Playgroud)
必须使用搜索字符串进行选择,例如:
'joh'
'do'
'JOHN doe'
Run Code Online (Sandbox Code Playgroud)
不必选择
'ohn'
'oe'
Run Code Online (Sandbox Code Playgroud)
我需要(可能)避免全文搜索。
我发现有效的是
$query = 'SELECT * FROM MYTABLE WHERE SEARCHFIELD LIKE "' . $searchText . '%"'
. 'OR SEARCHFIELD LIKE "% ' . $searchText . '%"'
Run Code Online (Sandbox Code Playgroud)
我想问是否有更好的方法来做到这一点。
(对于“更好的方式”,我的意思是更好的性能或相同的性能但更优雅)
另外,由于查询将使用准备好的语句构建,因此我应该如何对搜索字符串中的LIKE元字符进行转义?
以下查询对我来说非常好:
SELECT * From Customers
WHERE Customers.ContactName = (SELECT FirstName
FROM Employees as E, orders as O
WHERE <condition>
LIMIT 1);
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用LIKE而不是=与子查询的结果进行比较,则不会得到任何结果。如何LIKE '%%'在上述查询中使用?
我想根据整个标题名称和标题词搜索产品。可以LIKE使用UNION. 我的数据库title(charchar(550)) = Colorzone Men's Casual Wear Red Cotton Shirt不是全文——
PHP 和 MYSQL 的最佳搜索算法是什么?
但是我需要将搜索结果(第一:Cotton Shirt记录,第二 Cotton记录和第三:Shirt记录。不应显示混合的所有记录)作为单个查询
MYSQL 查询:例如:标题 =Cotton Shirt
SELECT title FROM zapstore_ecom_products WHERE title LIKE '%Cotton Shirt%' //Get Whole Title products.
UNION
SELECT title FROM zapstore_ecom_products WHERE title LIKE '%Cotton%' //Get list for first word Title products.
UNION
SELECT title FROM zapstore_ecom_products WHERE title LIKE '%Shirt%' //Get …Run Code Online (Sandbox Code Playgroud) 希望有人可以帮助我并为我解释这个查询,为什么第一个查询返回结果但第二个没有:
编辑:第一个查询:
select name from Items where name like '%abc%'
Run Code Online (Sandbox Code Playgroud)
第二个查询:
select name from Items where name like substring('''%abc%''',1,10)
Run Code Online (Sandbox Code Playgroud)
为什么第一个返回结果但第二个什么都不返回
substring('''%abc%''',1,10)='%abc%'
Run Code Online (Sandbox Code Playgroud)
如果这背后有逻辑,是否有另一种方法来做第二个查询之类的事情,
我的 porpuse 是将像 '''abc''' 这样的字符串转换为 'abc' 以便使用 like 语句,
我有一个people以body列为jsonb类型的表。
Table "public.people"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
-----------------+-----------------------------+-----------+----------+--------------------+----------+--------------+-------------
id | uuid | | not null | uuid_generate_v4() | plain | |
body | jsonb | | not null | | extended | |
Indexes:
"people_pkey" PRIMARY KEY, btree (id)
"idx_name" gin ((body ->> 'name'::text) gin_trgm_ops)
Run Code Online (Sandbox Code Playgroud)
我的索引如下所示:
CREATE INDEX idx_name ON people USING gin ((body ->> 'name') gin_trgm_ops);
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时:
EXPLAIN ANALYZE SELECT * …Run Code Online (Sandbox Code Playgroud) 字段被定义为array(varchar)模式分析。
我想搜索字段包含特定文本模式的记录,说道'ABCD'。
如果我运行这个 SQL:
select * from data_table
where top_results like '%ABCD%'
Run Code Online (Sandbox Code Playgroud)
它抛出这个错误:
查询失败 (#20190730_021145_23663_dn9fj):第 2:7 行:LIKE 表达式的左侧必须计算为 varchar(实际:array(varchar)
检测某个字符串是否存在的正确语法是什么?
我正在尝试过滤掉包含客户互联网计划的列 (plan_name)。例如(200GB 快速无限、免费附加邮箱、无限 VDSL...)。我特别想过滤掉没有任何数字的计划。该列的类型为 varchar2,我正在查询 Oracle 数据库。我编写了以下代码:
SELECT *
FROM plans
WHERE plan_name NOT LIKE '%[0-9]%'
Run Code Online (Sandbox Code Playgroud)
但是,此代码仍会快速返回 200GB 之类的计划,其中包含数字?谁能解释这是为什么?
是否有一种简单的临时方式来ILIKE对表的所有文本列执行查询?
我知道有一个包含“foobar”的单元格。但是该表有很多列并且只有 50k 行,因此搜索所有列和行应该很快。