Php 连接多个表和搜索参数

Php 连接多个表和搜索参数,php,mysql,Php,Mysql,我的数据库有两个表,一个用于存储客户Id和客户信息。第二个表是用key/value排序的,因为我需要存储未定义的值,而无需更改customers表 表格结构 表客户: ================= id | status ================= ================= id | status 1 | 1 2 | 1 3 | 1 ================== 表客户信息: ==================

我的数据库有两个表,一个用于存储客户Id和客户信息。第二个表是用key/value排序的,因为我需要存储未定义的值,而无需更改customers表

表格结构

表客户:

=================
    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绑定。当您执行此处所做的操作时,您将执行更多根本不需要的数据库操作

祝你好运

阿列克塞