2010-11-09 87 views
0

我有2代表具有以下結構...如何返回多個記錄ID(MySQL)的所有鍵/值對?

Table cellphone_tokens: 
----------- 
| id (pk) | 
| model | 
----------- 

Table cellphone_keys_vals: 
----------- 
| cell_id | 
| key  | 
| value | 
----------- 

cell_id是在第一表格中的相應的模型的id。爲了方便起見,我還在第二個表格中再次輸入了model

假設我需要選擇所有keysvalues以獲得特定model(或最多4個模型)。我如何能夠寫一個查詢來實現這個?

回答

0

您可以使用內部查詢:

SELECT 
v.* 
FROM cellphone_keys_vals AS v 
WHERE v.cell_id IN (
    SELECT 
      t.id 
    FROM cell_phone_tokens as t 
      WHERE t.model IN ("model1", "model2") 
    ) 
+0

嘿Simendsjo ...我用以下語句:SELECT'key','value' FROM wp_cellphone_keys_vals LEFT JOIN wp_cellphone_tokens ON'wp_cellphone_tokens'.'id' ='wp_cellphone_keys_vals'.'cell_id' 其中'wp_cellphone_tokens' .'model' IN('E8','W850i')。這與你所建議的相似嗎? – Rutwick 2010-11-10 08:31:17

+0

@Rutwick:是的。這個例子首先是次選中的一個限制,因爲我認爲你的問題是「限於4部電話」,而不是模型。在我將其更正爲模型後,我只是沒有更改我的答案。我會用你的連接,而不是這個:) – simendsjo 2010-11-10 08:39:30

+0

謝謝Simendsjo!而我有另一個SQL問題(!)... – Rutwick 2010-11-10 10:32:28

0

首先,不要貼在兩個地方的model領域。它使得確保數據完整性變得更加困難,並且不利用關係數據庫的「關係」部分。

其次,看起來您正在爲您的cellphone_keys_vals表使用垂直模式。如果有很多密鑰不經常使用,這可能很有用。但是,在每個鍵都是字段的情況下使用橫向模式更爲常見,效率更高。所以說有3個'鑰匙':顏色,價格,尺寸。你cellphone_key_values表變成了cellphone表:

cell_id INT UNSIGNED NOT NULL PRIMARY KEY, 
token_id INT UNSIGNED NOT NULL, 
colour VARCHAR(10), 
price DECIMAL(5,2), 
size ENUM('s','m','l'), 
CONSTRAINT `FK_cellphone1` FOREIGN KEY (`token_id`) REFERENCES `cellphone_tokens` (`id`) 

然後,它很簡單:

SELECT c.cell_id, t.model, c.colour, c.size, c.price FROM 
cellphones c JOIN cellphone_tokens t ON (c.token_id=t.id) 

得到所有的手機,其中包括他們的模型。如果你想限制爲一組特定的模型,你可以添加一個WHERE條款:

SELECT c.cell_id, t.model, c.colour, c.size, c.price FROM 
cellphones c JOIN cellphone_tokens t ON (c.token_id=t.id) 
WHERE t.model IN ('blah','foo','bar') 

如果你想限制爲最多4個車型你不在乎哪個型號,這樣的事情可能工作:

SELECT c.cell_id, t.model, c.colour, c.size, c.price FROM 
cellphones c JOIN cellphone_tokens t ON (c.token_id=t.id) 
WHERE t.model IN (SELECT id FROM cellphone_tokens ORDER BY rand() LIMIT 4); 

注意ORDER BY rand()是相當低效的,所以如果你的cellphone_tokens表將有很多行,這不是一個很好的選擇。

+0

嗨dnagirl ...非常感謝!當我有固定數量的屬性時(每列代表一個屬性),我使用了橫向模式。但是之後我不得不改變它以使用垂直模式(鍵,vals),因爲需求被更新並且用戶希望能夠爲手機添加新的屬性(除了固定的屬性),如果他願意的話。它導致了過於寬泛和複雜的表結構(每個單元的額外屬性數量不可預測!)。使用鍵/值方法,我發現在不修改表結構的情況下添加新屬性更容易。 (!) – Rutwick 2010-11-10 08:17:25

+0

所以有一點亂,我做了以下內容:SELECT'key','value' FROM wp_cellphone_keys_vals LEFT JOIN wp_cellphone_tokens ON'wp_cellphone_tokens'.'id' ='wp_cellphone_keys_vals'.'cell_id' 其中' wp_cellphone_tokens'.'model' IN('E8','W850')。我剛剛檢查了請求查看的手機數量,並將它們插入IN部分。 – Rutwick 2010-11-10 08:22:33

相關問題