我有一個SQLite表「詳細資料」與結構:SQLite的select語句的優化建議
ID Name Category
---------------------
1 Matt 0
2 Shervin 0
3 Bob 0
4 Lee 0
5 Rick 0
6 Suraya 0
7 Susan 0
8 Adam 0
9 Jon 1
10 Lorna 1
... and so on .......
我想隨機選擇一排,然後從三個不同行的三個名字(同樣優選隨機)。我想這一切都從一個SQLite語句返回。例如。
ID Name Category Name1 Name2 Name 3
----------------------------------------
3 Bob 0 Matt Lee Susan
我在這一嘗試可以看到下面,但它有兩個問題:
- 三個額外的名稱不一定總是不同的 - 我似乎無法排除已經名稱之前選擇,因爲變量b/c/d不在他們自己的COALESCE函數的範圍之內。
- 由於每個嵌套select使用Random()函數,因此效率不高。
任何人都可以提出另一種方法來選擇我需要的數據(使用SQLite數據庫)?任何幫助/建議都是值得歡迎的 - 希望明確我想達到的目標,隨時要求澄清。
我當前的嘗試:
SELECT a.Id,
a.Name,
a.Category,
COALESCE((SELECT b.Name
FROM Details b
WHERE b.Id NOT IN (a.Id)
AND b.Category IN (0)
ORDER BY Random()
LIMIT 1),'') as "Name1",
COALESCE((SELECT c.Name
FROM Details c
WHERE c.Id NOT IN (a.Id)
AND c.Category IN (0)
ORDER BY Random()
LIMIT 1),'') as "Name2",
COALESCE((SELECT d.Name
FROM Details d
WHERE d.Id NOT IN (a.Id)
AND d.Category IN (0)
ORDER BY Random()
LIMIT 1),'') as "Name3"
FROM Details a
AND a.Category IN (0)
ORDER BY Random()
LIMIT 1
我看不到這樣做_shuffle_在SQL中,而不是在代碼中任何優勢將要處理的數據(如果有的話當然) – neurino 2011-05-22 21:41:45
@neurino:如果你在SQL中這樣做的話,你可能會比傳遞整個列表中的客戶端項目更少的數據傳輸給客戶端。 – 2011-05-23 08:33:30
@neurino:我在iPhone應用程序中使用此代碼。所以我的思考過程是儘量減少傳輸的數據量和對SQLite數據庫的調用次數。 – MattStacey 2011-05-23 09:32:11