如何返回多个记录ID(MySQL)的所有键/值对?

时间:2010-11-09 13:32:17

标签: mysql database

我有2张表,结构如下......

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

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

cell_id是第一个表中相应模型的id。为方便起见,我还在第二张表中再次输入model

假设我需要为特定keys(或最多4个型号)选择所有valuesmodel。我怎么能写一个查询来实现这个目标?

2 个答案:

答案 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表有很多行,那么这不是一个好选择。