首先,不要貼在兩個地方的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表將有很多行,這不是一個很好的選擇。
嘿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
@Rutwick:是的。這個例子首先是次選中的一個限制,因爲我認爲你的問題是「限於4部電話」,而不是模型。在我將其更正爲模型後,我只是沒有更改我的答案。我會用你的連接,而不是這個:) – simendsjo 2010-11-10 08:39:30
謝謝Simendsjo!而我有另一個SQL問題(!)... – Rutwick 2010-11-10 10:32:28