我是mysql的新手。现在,我在mysql数据库中有这种结构:
| keyID | Param | Value
| 123 | Location | Canada
| 123 | Cost | 34
| 123 | TransportMethod | Boat
...
...
我可能有20个参数,每个密钥ID都有唯一的值。我希望能够在mysql中搜索每个值的20个参数,并找出哪个keyID。
首先,我应该如何重构mysql数据库?我应该有20个param列+ keyID吗? 其次,(与第一个问题有关),我如何进行查询以找到keyID?
答案 0 :(得分:2)
如果你的参数在不同的键之间是相同的(或者所有参数都是对象可能具有的一组参数的子集),你应该构造数据库,使每列都是一个参数,并且该行对应一个KeyID和它的参数值。
|keyID|Location|Cost|TransportMethod|...|...
|123 |Canada |34 |Boat ...
|124 | ...
...
然后要查询keyID,您将使用SELECT,FROM和WHERE语句,例如,
SELECT keyID
FROM key_table
WHERE Location='Canada'
AND Cost=34
AND TransportMethod='Boat'
...
有关详细信息,请参阅http://www.w3schools.com/php/php_mysql_where.asp
编辑:如果你的参数在不同的对象(keyIDs)之间发生变化,我认为这需要采用不同的方法
答案 1 :(得分:1)
您展示的设计称为实体 - 属性 - 值。它破坏了关系数据库设计的许多规则,并且很难与SQL一起使用。
在关系数据库中,每个属性类型都应该有一个单独的列。
CREATE TABLE MyTable (
keyID SERIAL PRIMARY KEY,
Location VARCHAR(20),
Cost NUMERIC(9,2),
TransportMethod VARCHAR(10)
);
答案 2 :(得分:0)
我同意Nick的答案可能是最好的,但是如果你真的希望保留你的键/值格式,你可以用视图完成你想要的东西(这是PostgreSQL语法,因为那是我熟悉的,但MySQL的概念是相同的:
CREATE OR REPLACE VIEW myview AS
SELECT keyID,
MAX(CASE WHEN Param = 'Location' THEN Value END) AS Location,
MAX(CASE WHEN Param = 'Cost' THEN Value END) AS Cost,
....
FROM mytable;
此处的表现可能很糟糕,但如果您的查询不频繁,则可以完成工作。