我有2个表的数据库,1个用于存储客户ID和客户信息。第二个表按键/值排序,因为我需要存储未定义的值而无需更改customers表。
表格结构
表客户:=================
id | status
=================
table customers_info:
=======================================
id | id_customer | key | value
=======================================
内容示例:
表客户:=================
id | status
1 | 1
2 | 1
3 | 1
==================
table customers_info
=======================================
id | id_customer | key | value
1 | 1 | name| Doe
2 | 1 | age | 25
3 | 1 | city| NY
4 | 2 | name| Smith
5 | 2 | age | 26
6 | 3 | age | 30
=======================================
我只是用
查询我的表格SELECT ci.id_customer AS CustomerId,
MAX(CASE WHEN ci.key = 'name' THEN ci.value ELSE '' END) AS CustomerName,
MAX(CASE WHEN ci.key = 'age' THEN ci.value ELSE '' END) AS CustomerAge,
MAX(CASE WHEN ci.key = 'city' THEN ci.value ELSE '' END) AS CustomerCity
FROM customers_info ci
GROUP BY ci.id_customer
ORDER BY ci.id_customer;
我可以获得所有客户,但不能查询年龄参数,例如,我尝试尝试搜索每个25岁的客户,但是使用此查询我无法获得客户的所有价值......
SELECT ci.id_customer AS CustomerId,
MAX(CASE WHEN ci.key = 'name' THEN ci.value ELSE '' END) AS CustomerName,
MAX(CASE WHEN ci.key = 'age' THEN ci.value ELSE '' END) AS CustomerAge,
MAX(CASE WHEN ci.key = 'city' THEN ci.value ELSE '' END) AS CustomerCity
FROM customers_info ci
LEFT JOIN customers_info on customers_info.age = '25'
GROUP BY ci.id_customer
ORDER BY ci.id_customer;
我想得到
=======================================
id_customer | name | age | city
1 | Doe | 25 | NY
=======================================
答案 0 :(得分:1)
我不确定你这样做的方式是最好的方式(我不确定我会使用最大值来做到这一点,我也不认为我会以你的方式创建表格 - 因为在这里如果你正在执行几个额外的操作,以获得你正在使用的键值表 - 但这是我的去 -
首先,我的创建语句:
create database CustomerLinkQuestion;
use CustomerLinkQuestion;
create table customers (
id int,
status int
);
create table customer_info (
id int,
id_customer int,
k varchar(255),
v varchar(255)
);
无论出于何种原因(这可能是因为我没有那么多地使用MySQL)键和值不起作用(可能是保留的)所以我使用k和v作为键和值段。
核心概念是你将不得不使用某种类型或视图的子查询(视图会更好) -
select * From (
SELECT ci.id_customer AS CustomerId,
MAX(CASE WHEN ci.k = 'name' THEN ci.v ELSE '' END) AS CustomerName,
MAX(CASE WHEN ci.k = 'age' THEN ci.v ELSE '' END) AS CustomerAge,
MAX(CASE WHEN ci.k = 'city' THEN ci.v ELSE '' END) AS CustomerCity
FROM customer_info ci
GROUP BY ci.id_customer
ORDER BY ci.id_customer) as sub
where sub.CustomerAge = 25
内部(括号中的部分和被调用的子部分)正是您发布的内容(除了 - 无论出于何种原因在我的测试服务器上我使用“客户”而不是“客户”)。然后是子查询,然后where子句减少子查询。
再一次 - 我强烈建议你看一下你的架构和设计,因为你似乎正在尝试创建一个代码表,它只是没有意义。您将在客户表中最终得到固定数量的字段,每个字段都绑定到特定客户。当您正在执行此处所执行的操作时,您正在执行更多数据库操作,而这些操作根本不是必需的。
祝你好运!
Aleksei