2011-12-21 69 views
1

說我有一個表Guest,它有列g_id:值1到10訂購SQL查詢以特定的順序

現在我想查詢返回我G_ID的既不是按照升序還是在下降。 但我想要第四,然後第三,然後第五個條目,在這個特定的順序。 另外我想只是第4第3和第5條目。

說我的作品有一個id和一個名字。 ;即。我的桌子Guest有這兩張桌子。 現在我的表如下。

1 A 
2 B 
3 C 
4 D 
5 E 
6 F 
7 G 
8 H 
9 I 
10 J 

現在我想只是第4第3和第5 g_id的條目,在這個特定的順序。

我該如何編寫SQL查詢? 謝謝。

SELECT * FROM遊客_ __ _ __ _ ____ ???

請填寫空白處。

+0

所以,應該在哪裏G_ID值1,2,6,7,8,9和10適合在這個搜索順序? – 2011-12-21 16:20:28

+0

@布賴恩胡佛編輯..唯一的ID需要3 4 5。 – Kraken 2011-12-21 16:22:01

+0

沒有一個例子,這是很難理解的。 – 2011-12-21 16:24:37

回答

2

您可以使用CASE語句進行ORDER BY對排序上使用假列和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 
2

判斷是否是第4,第3或第5的順序是什麼?沒有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 
0

一種解決方案是case聲明:

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 
); 
+0

也我只想這三個條目..不是全部!我如何適應這一點? – Kraken 2011-12-21 16:22:48

+0

查看帖子的編輯...你可以說從一開始;) – fge 2011-12-21 16:24:14

+0

什麼是virtcol? 也不會我需要做的地方g_id = 4 && g_id = 3 && g_id = 5。 – Kraken 2011-12-21 16:25:43

0

我不知道如何設置你的訂貨會,但你可以通過具體命令:

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); 
0

我認爲答案主要取決於您正在使用的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 
0

這個查詢將獲得你的第3,第5和第4項(limit 2, 1意味着「檢索開始第三個項目,總人數檢索= 1點的記錄)

(select g_id from Guest limit 2,1) 
UNION (select g_id from Guest limit 4,1 
UNION (select g_id from Guest limit 3,1)