按字母顺序排序查询结果,但在排序中排除“the”?

时间:2013-10-06 15:31:47

标签: mysql sql laravel laravel-4

假设我有一个Laravel 4应用程序。我们还说我有一个填充的电影表。

此:

$movies = Movie::orderBy('title', 'ASC')->get();

返回:

Braveheart
Silent Hill
The Big Lebowski
Waterworld

我想要的是忽略排序中的“the”以返回:

The Big Lewbowski
Braveheart
Silent Hill
Waterworld

Laravel内部有什么可以让这件事变得容易吗?你会怎么做?我是否需要编写自定义SQL查询?

谢谢!

3 个答案:

答案 0 :(得分:2)

祝你好日子

将结果存储在数组中。 循环遍历数组并删除所有'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

多数民众赞成

答案 1 :(得分:1)

不确定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”,您可以使用CASELEFT来检查“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();

答案 2 :(得分:1)

我对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将替换所有出现的目标字符串(例如“Gone With The Wind”将被更改。< / p>