2014-01-22 107 views
1

我有兩個表,路線和用戶。每條路由都有一個整數ID,每個用戶都有一個逗號分隔的路由列表,他們可以訪問。我試圖從路由表中選擇那些行,其id位於用戶行的id列表中。sqlite3:我想根據不同表中的ID列表選擇行

查詢(至少我是怎麼想的,應該形成),我嘗試使用是一樣的東西

select * 
from routes 
where id in (select allowed_ids 
      from users 
      where username = 'sameple'); 

路由表的格式爲

id, name 
0, 'test name' 
2, 'test name' 
3, 'test name' 

用戶表格式爲

id, name, username, password, allowed_ids 
0, 'name', 'uname', 'md5pw', '0, 3' 

問題是,這是行不通的。有沒有更好的方法或做到這一點?

我對SQL很陌生,所以任何幫助都非常感謝!

+0

你的問題是什麼?你使用的是子查詢,它是一個基於來自其他表的值得到來自一個表的結果的有效選項。 – 2014-01-22 21:14:45

+0

您會發現在這裏使用連接會很有用。 – squiguy

+0

@squiguy好吧,怎麼樣? –

回答

1

我會創建第三個表,其中保存了用戶ID和路徑ID。

UserRoutes 
PrimaryKey->ID 
ForeignKey->UserID 
ForeignKey->RoutesKey 

Users 
PrimaryKey->ID 

Routes 
PrimaryKey->ID 

所以,你可以

SELECT * FROM UserRoutes, Routes WHERE UserRoutes.UserID = x; 

也覺得這標準的方式SQLite中。

0

使用join(假設allowed_ids是一個數組):

SELECT * 
FROM routes 
JOIN users 
ON id = ANY(users.allowed_ids) 
WHERE username = 'sample' 
+0

不幸的是,在sqlite3中沒有數組。 –

+0

在這種情況下,我會建議戈登的答案。 – That1Guy

+0

謹慎解釋downvote? – That1Guy

1

這是行不通的,但這樣的可能:

select r.* 
from routes r 
where exists (select 1 
       from users u 
       where username = 'sameple' and 
        ', '||u.allowed_ids||', ' like '%, '||id||', %' 
      ); 

您也可以表達這種join,但這會保持你嘗試的精神。

以逗號分隔的文本列存儲事物列表不好想法。你應該有一個單獨的表,每個用戶有一行,allowed_id。

+0

不幸的是我無法得到這個工作。 –

+0

問題是什麼? –

相關問題