我有2张表,结构如下......
Table cellphone_tokens:
-----------
| id (pk) |
| model |
-----------
Table cellphone_keys_vals:
-----------
| cell_id |
| key |
| value |
-----------
cell_id
是第一个表中相应模型的id
。为方便起见,我还在第二张表中再次输入model
。
假设我需要为特定keys
(或最多4个型号)选择所有values
和model
。我怎么能写一个查询来实现这个目标?
答案 0 :(得分: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")
)
答案 1 :(得分:0)
首先,不要将model
字段粘贴在2个位置。这使得确保数据完整性变得更加困难,并且它没有利用关系数据库的“关系”部分。
其次,您似乎正在为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表有很多行,那么这不是一个好选择。