Php 按特定顺序对SQL查询排序

Php 按特定顺序对SQL查询排序,php,sql,sql-order-by,Php,Sql,Sql Order By,假设我有一个表Guest,它有列g_id:值1到10 现在,我希望查询返回的g_id既不是升序,也不是降序。。 但是我想要第四、第三、第五个条目,按照这个特定的顺序。 我还想要第四、第三和第五个条目 假设我的条目有一个id和一个名称;i、 我的客人有这两张桌子。 现在我的表如下 1 A 2 B 3 C 4 D 5 E 6 F 7 G 8 H 9 I 10 J 现在我只想要第四个第三个和第五个g_id的条目,并且按照这个特定的顺序 如何编写SQL查询? 谢谢 从来宾中选择* 请填空。决定某事物是

假设我有一个表
Guest
,它有列
g_id
:值1到10

现在,我希望查询返回的g_id既不是升序,也不是降序。。 但是我想要第四、第三、第五个条目,按照这个特定的顺序。 我还想要第四、第三和第五个条目

假设我的条目有一个id和一个名称;i、 我的客人有这两张桌子。 现在我的表如下

1 A
2 B
3 C
4 D
5 E
6 F
7 G
8 H
9 I
10 J
现在我只想要第四个第三个和第五个g_id的条目,并且按照这个特定的顺序

如何编写SQL查询? 谢谢

从来宾中选择*


请填空。

决定某事物是第四、第三还是第五的顺序是什么?如果没有ORDER BY子句,SQL将以不确定的顺序返回数据。不能依赖于在数据库表本身中输入或存储行的顺序

您可以将您的问题硬编码如下:

select *
from Guest
order by case 
    when g_id = 4 then 1
    when g_id = 3 then 2
    when g_id = 5 then 3
    else 4
end

决定某物是第四、第三还是第五的顺序是什么?如果没有ORDER BY子句,SQL将以不确定的顺序返回数据。不能依赖于在数据库表本身中输入或存储行的顺序

您可以将您的问题硬编码如下:

select *
from Guest
order by case 
    when g_id = 4 then 1
    when g_id = 3 then 2
    when g_id = 5 then 3
    else 4
end

您可以在
orderby
中使用
CASE
语句来使用伪列进行排序,并使用
WHERE in
子句仅返回所需的值

SELECT * 
FROM   Guest
WHERE  g_id IN (3, 4, 5)
ORDER BY
       CASE WHEN g_id = 4 THEN 1
            WHEN g_id = 3 THEN 2
            WHEN g_id = 5 THEN 3
       END

您可以在
orderby
中使用
CASE
语句来使用伪列进行排序,并使用
WHERE in
子句仅返回所需的值

SELECT * 
FROM   Guest
WHERE  g_id IN (3, 4, 5)
ORDER BY
       CASE WHEN g_id = 4 THEN 1
            WHEN g_id = 3 THEN 2
            WHEN g_id = 5 THEN 3
       END

一种解决方案是
案例
语句:

select g_id from (
    select g_id, case g_id
       when 4 then 1
       when 3 then 2
       when 5 then 3
       else 0
    end virtcol
    where virtcol != 0
    order by virtcol
);

一种解决方案是
案例
语句:

select g_id from (
    select g_id, case g_id
       when 4 then 1
       when 3 then 2
       when 5 then 3
       else 0
    end virtcol
    where virtcol != 0
    order by virtcol
);

我不确定您的订单设置如何,但您可以根据具体情况进行订购:

ORDER BY
   g_id = 4 DESC,
   g_id = 3 DESC,
   g_id = 5 DESC
您最好按原样选择条目,并在php代码中执行以下操作:

$order = array('4 ', '3 ', '5 ');
$data = array();
while ($row = $result->fetch()) {
   $data["$row->g_id "] = $row;
}
$data = array_merge(array_flip($order), $data);

我不确定您的订单设置如何,但您可以根据具体情况进行订购:

ORDER BY
   g_id = 4 DESC,
   g_id = 3 DESC,
   g_id = 5 DESC
您最好按原样选择条目,并在php代码中执行以下操作:

$order = array('4 ', '3 ', '5 ');
$data = array();
while ($row = $result->fetch()) {
   $data["$row->g_id "] = $row;
}
$data = array_merge(array_flip($order), $data);

我认为答案主要取决于您正在使用的DBMS

在Oracle中,下面的查询即使效率低下,也应该可以工作

select * from 
    (select * , rownum as order from guest order by id asc ) b 
where b.order = 4
UNION
select * from 
    (select * , rownum as order from guest order by id asc ) b 
where b.order = 3
UNION
select * from 
    (select * , rownum as order from guest order by id asc ) b 
where b.order = 5
不确定通过一个简单的查询是否可以实现更高效的功能, 只有当您查询的表非常小时,我才会使用上面的怪物

如果表很大,并且只需要提取第一行,那么您还有另一个选项。在您描述的示例中,我将检索前5行,然后以编程方式提取位置4,3,5处的行

您可以在oracle中使用此查询提取前5行

select * from guest order by id asc where rownum < 6
根据id asc从客人订单中选择*,其中rownum<6

我认为答案主要取决于您正在使用的DBMS

在Oracle中,下面的查询即使效率低下,也应该可以工作

select * from 
    (select * , rownum as order from guest order by id asc ) b 
where b.order = 4
UNION
select * from 
    (select * , rownum as order from guest order by id asc ) b 
where b.order = 3
UNION
select * from 
    (select * , rownum as order from guest order by id asc ) b 
where b.order = 5
不确定通过一个简单的查询是否可以实现更高效的功能, 只有当您查询的表非常小时,我才会使用上面的怪物

如果表很大,并且只需要提取第一行,那么您还有另一个选项。在您描述的示例中,我将检索前5行,然后以编程方式提取位置4,3,5处的行

您可以在oracle中使用此查询提取前5行

select * from guest order by id asc where rownum < 6
根据id asc从客人订单中选择*,其中rownum<6

此查询将获得第三、第五和第四项(
限制2、1
表示“从第三项开始检索,检索总数=1条记录)


此查询将获得第三、第五和第四项(
limit 2,1
表示“从第三项开始检索,检索总数=1条记录”)


那么,g_id值1、2、6、7、8、9和10在这个搜索顺序中应该放在哪里呢?@Brian Hoover编辑。。只需要id的3 4 5。如果没有一个例子,这很难理解。使用这个:g_id在(3,4,5)中的位置,我认为到目前为止所有这些答案都忽略了一个事实,即OP不想要g_id 4,3,5,而是g_id列随机分布的第4,第3和第5个条目,这可能是g_id(1,10,3),所以,“g_id值1、2、6、7、8、9和10在这个搜索顺序中应该放在哪里?”布赖恩·胡佛编辑。。只需要id的3、4、5。如果没有一个例子,这很难理解。使用这个:g_id在(3、4、5)中的位置,我认为到目前为止所有这些答案都忽略了一个事实,即OP不需要g_id 4、3、5,而是g_id列随机分布的第4、第3和第5个条目,这可能是g_id(1、10、3)而且我只想要这三个条目。。不是全部!我该如何将其融入到这篇文章中?请参阅文章的编辑。。。从一开始你就可以这么说;)什么是病毒醇??在g_id=4&&g_id=3&&g_id=5的情况下,我也不需要这样做。它只是
案例的一个名称。。。结束
语句,可能是
herpies
snafu
…我只想要这三个条目。。不是全部!我该如何将其融入到这篇文章中?请参阅文章的编辑。。。从一开始你就可以这么说;)什么是病毒醇??在g_id=4&&g_id=3&&g_id=5的情况下,我也不需要这样做。它只是
案例的一个名称。。。结束
语句,可能是
herpies
snafu
。。。