Php 连接多个表和搜索参数
我的数据库有两个表,一个用于存储客户Id和客户信息。第二个表是用key/value排序的,因为我需要存储未定义的值,而无需更改customers表 表格结构 表客户:Php 连接多个表和搜索参数,php,mysql,Php,Mysql,我的数据库有两个表,一个用于存储客户Id和客户信息。第二个表是用key/value排序的,因为我需要存储未定义的值,而无需更改customers表 表格结构 表客户: ================= id | status ================= ================= id | status 1 | 1 2 | 1 3 | 1 ================== 表客户信息: ==================
=================
id | status
=================
=================
id | status
1 | 1
2 | 1
3 | 1
==================
表客户信息:
=======================================
id | id_customer | key | value
=======================================
内容示例:
表客户:
=================
id | status
=================
=================
id | status
1 | 1
2 | 1
3 | 1
==================
表客户信息
=======================================
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
=======================================
我不确定您这样做是否是最好的方式(我不确定我会使用最大值来做这件事,我也不认为我会以您这样做的方式创建表-因为在这种情况下,您要执行多个额外的操作,以获得您正在使用的键值表)-但我要做的是- 首先,我的create语句:
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作为键和值段
核心概念是您必须使用某种类型的子查询或视图(视图更好)——
内部(括号中的部分称为sub)正是您发布的内容(除了-出于任何原因,我在测试服务器上使用了“客户”而不是“客户”)。然后是子查询,然后是where子句,将子查询缩减
再一次-我强烈建议您查看您的模式和设计,因为您似乎试图为一些根本没有意义的东西创建一个代码表。您将在customer表中得到固定数量的字段,每个字段都与特定的customer绑定。当您执行此处所做的操作时,您将执行更多根本不需要的数据库操作
祝你好运
阿列克塞