加入多个表和搜索参数

时间:2015-10-02 15:44:59

标签: php mysql

我有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
=======================================

1 个答案:

答案 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