如何将表结构从几列修改为一列?

时间:2014-06-23 13:57:03

标签: mysql sql

我试着解释我需要什么...... 我有一个简单的表data

id | post_id | color | year
---------------------------
1  | 1       | red   | 1989
2  | 1       | red   | 1990
3  | 1       | green | 1991

下一个查询工作正常:

SELECT * 
FROM  `data` 
WHERE color = 'red'
AND year = 1989

并且返回结果:

id | post_id | color | year
---------------------------
1  | 1       | red   | 1989

我需要从列coloryear中逃脱,因为它们必须是动态的。

我尝试做这样的事情:

id | post_id | property
-----------------------
1  | 1       | red 
2  | 1       | green
3  | 1       | 1989
4  | 1       | 1990
5  | 1       | 1991

但是有一些问题,因为当我执行下一个查询时:

SELECT * 
FROM  `data` 
WHERE property = 'red'
AND property = 1989

我无法使用color = 'red'year = 1989发帖,mysql会返回空结果。

如何修改我的表以便从列coloryear中进行转义并保留第一个示例的查询逻辑?

1 个答案:

答案 0 :(得分:1)

保留第一个查询,但只使用结合返回两列:

SELECT POST_ID, color as property 
FROM  `data` 
WHERE color = 'red'
AND year = 1989
UNION ALL
SELECT Post_ID, Year as Property 
FROM  `data` 
WHERE color = 'red'
AND year = 1989

虽然我无法想象自己使用它。我更喜欢单独的列;我无法想象业务需要或技术需要返回列表作为您的描述。如果您需要一列,则应在显示级别控制演示文稿,迭代列并以不同方式呈现它。

---基于评论的编辑 -

啊自定义字段: 所以看起来你的问题似乎不是关于设计,你已经涵盖了......有几种方法可以做到这一点。你的问题似乎是这样的:

当用户定义2个不同的值进行过滤时,如何确保每个数据对象都包含所有两个元素?

使用having子句和/或语句:

Select post_ID, property
from data
Where property = 'red'
or property = '1989'
group by post_Id, property
having count(post_ID) = 2

您知道根据所选的数量查找了多少个属性。所以只需在拥有子句中使用它作为属性。