按字母顺序对查询结果进行排序,但在排序中排除“the”?
Posted
技术标签:
【中文标题】按字母顺序对查询结果进行排序,但在排序中排除“the”?【英文标题】:Sort query results alphabetically, but exclude "the" in sorting? 【发布时间】:2013-10-13 04:22:01 【问题描述】:假设我有一个 Laravel 4 应用程序。假设我有一个填充的 Movies 表。
这个:
$movies = Movie::orderBy('title', 'ASC')->get();
返回这个:
Braveheart
Silent Hill
The Big Lebowski
Waterworld
我想要的是忽略排序中的“the”以返回:
The Big Lewbowski
Braveheart
Silent Hill
Waterworld
在 Laravel 中有什么东西可以让这件事变得简单吗?你会如何处理这个问题?我需要编写自定义 SQL 查询吗?
谢谢!
【问题讨论】:
【参考方案1】:你好,早安
将结果存储在数组中。 遍历数组并删除所有的“The”。
类似这样的:
$str = "The quick brown fox jumps over the lazy dog."
if(substr($str, 0, 4) = 'The ')
$str2 = substr($str, 4); // "quick brown fox jumps over the lazy dog."
从上面的东西创建一个新数组。
然后做这样的事情:
<?php
$fruits = array("lemon", "orange", "banana", "apple");
sort($fruits);
foreach ($fruits as $key => $val)
echo "fruits[" . $key . "] = " . $val . "\n";
?>
这将按字母顺序对它们进行排序:
fruits[0] = apple
fruits[1] = banana
fruits[2] = lemon
fruits[3] = orange
就是这样
【讨论】:
【参考方案2】:我对 Laravel 也一无所知,但这个查询可能会做你想做的事:
SELECT title
FROM movies
ORDER BY
CASE
WHEN SUBSTRING(title FROM 1 FOR 4) = 'The '
THEN SUBSTRING(title,5)
ELSE title
END DESC
引用REPLACE
函数的另一个答案可能也足够好,但请注意REPLACE
将替换所有出现的目标字符串(例如“乱世佳人”将被更改。
【讨论】:
Laravel 不需要那些东西。它很智能,并且拥有 PHP 世界中最先进的 ORM 之一,称为 Eloquent。检查它并与 RAW 查询说再见。 @Netbulae 你将如何使用 Laravel Eloquent 编写这个精确的查询? 您可以将 case 放在 select 语句中。这里已经回答了一个类似的问题:Laravel eloquent select case【参考方案3】:不确定 laravel 4 的语法,但是在 mysql 查询中你可以使用REPLACE
REPLACE(column, 'search', 'replace')
SELECT * FROM `movies` ORDER BY REPLACE(`title`, 'The', '')
对于 laravel 4 希望它可以工作但不确定
$movies = Movie::orderBy("REPLACE(`title`, 'The', '')", "ASC")->get();
REPLACE
编辑 仅在字符串开头搜索“The”,您可以使用CASE
和LEFT
来检查“The”的出现
SELECT * FROM `movies` ORDER BY
CASE WHEN LEFT(`title`,4) ='The '
THEN REPLACE(`title`, 'The ', '')
ELSE `title`
END
$movies = Movie::orderBy("CASE WHEN LEFT(`title`,4) ='The '
THEN REPLACE(`title`, 'The ', '')
ELSE `title`
END", "ASC")->get();
【讨论】:
它将删除所有匹配项。即使 The 位于中间。所以不好!以上是关于按字母顺序对查询结果进行排序,但在排序中排除“the”?的主要内容,如果未能解决你的问题,请参考以下文章