我有这样的人
------------------------------------------------
| id | full_name | first_name |
------------------------------------------------
| 1 | aaa bbb | aaa |
| 2 | bbb ccc | bbb |
| 3 | ddd aaa | ddd |
| 4 | aaa fff | aaa |
| 5 | aaa | aaa |
------------------------------------------------
我尝试搜索aaa,然后根据first name=where子句对结果进行排序,如下所示
SELECT `id`,`full_name`,`first_name` FROM `people`
WHERE `full_name` like '%aaa%'
Order by case
when full_name = 'aaa' then 1
when first_name like '%aaa' then 2
else 3 end asc
到目前为止,对我来说很好的是,我不想手动设置完整的名称='aaa'和第一个名称,如'%aaa',我想告诉mysql这样的事情
Order by case
when full_name = "what I searched for in my full_name where clause" then 1
when first_name like '%what I searched for in my full_name where clause' then 2
else 3 end asc
--
-- Table structure for table `people`
--
CREATE TABLE `people` (
`id` int(10) UNSIGNED NOT NULL,
`full_name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
`first_name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC;
--
-- Dumping data for table `people`
--
INSERT INTO `people` (`id`, `full_name`, `first_name`) VALUES
(1, 'aaa bbb', 'aaa'),
(2, 'bbb ccc', 'bbb'),
(3, 'ddd aaa', 'ddd'),
(4, 'aaa fff', 'aaa'),
(5, 'aaa', 'aaa');
编辑假设我只能在查询部分中写入aaa,其中全名(如“%aaa%”)是否有任何方法可以从where子句中读取aaa,而无需过程或设置变量将其按大小写传递给order
2条答案
按热度按时间z31licg01#
您应该查看用户定义的变量,然后使用
%
作为转义符来检查输入字符串是否包含%
签字。在此基础上,您可以更改您选择的列ORDER BY
.下面我举一个例子。
我定义了两个字符串
input_str1
包含%
以及input_str2
不包含%
符号。然后,在我的select查询中,我选择:input_str1
作为第一列input_str2
作为第二列第三列包含
1
如果input_str1
包含%
否则0
第四列包含1
如果input_str2
包含%
否则0
因此,输出为:如果您想根据找到的匹配项排序(这还不完全清楚,但我怀疑您正试图这样做),那么您可以类似地创建多个标志并使用这些标志来决定排序依据。
或者,如果您只是想根据输入字符串的内容来确定顺序,那么可以使用我上面介绍的概念,创建另一个用户定义的变量
order_by_column
根据输入字符串是否包含%
符号与否。.. 然后使用
@order_by_column
来整理你的结果。c6ubokkw2#
我的解释是你不想改变
aaa
第三部分,如果需要更改搜索参数。创建过程并使用动态查询。