2014-12-30 3 views
3

У меня есть база данных с 2 таблицами, 1 для хранения идентификаторов клиентов и для информации о клиентах. Вторая таблица упорядочена с ключом/значением, потому что мне нужно хранить неопределенные значения.MySQL присоединяется к нескольким строкам

структура таблицы

стол клиенты:

================= 
    id | status 
================= 

столик customers_info

======================================= 
    id | id_customer | key | value 
======================================= 

Содержание Пример:

стол клиентов:

================= 
    id | status 
    1 | 1 
    2 | 1 
================== 

стол customers_info

======================================= 
    id | id_customer | key | value 
    1 | 1   | name| Doe 
    2 | 1   | age | 25 
    3 | 1   | city| NY 
    4 | 2   | name| Smith 
======================================= 

Как я могу запросить таблицы, чтобы Dislay всех клиентов с их именами

Пример:

================= 
    1 | Doe 
    2 | Smith 
================= 

Если я просто сделать внутреннее соединение я получаю только первый ключ таблицы:

SELECT * FROM customers inner join customers_info on customers.id = customers_info.id_customer 
+1

Что делает столбец идентификаторов в customer_info? – Strawberry

+0

Ничего, только для того, чтобы иметь первичный ключ ... – Nathan

ответ

0

Попробуйте это:

SELECT ci.id_customer AS CustomerId, ci.value AS CustomerName 
FROM customers_info ci 
WHERE ci.key = 'name' 
ORDER BY ci.id_customer; 

Проверьте SQL FIDDLE DEMO

OUTPUT

| CUSTOMERID | CUSTOMERNAME | 
|------------|--------------| 
|   1 |   Doe | 
|   2 |  Smith | 

:: EDIT ::

Чтобы получить все поля для клиентов

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; 

Проверить SQL FIDDLE DEMO

ВЫВОД

| CUSTOMERID | CUSTOMERNAME | CUSTOMERAGE | CUSTOMERCITY | 
|------------|--------------|-------------|--------------| 
|   1 |   Doe |   25 |   NY | 
|   2 |  Smith |    |    | 

:: EDIT ::

для извлечения пола из пола таблицы:

SELECT a.CustomerId, a.CustomerName, a.CustomerAge, a.CustomerCity, g.name AS CustomerGender 
FROM (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 
    ) AS a 
INNER JOIN customers c ON a.CustomerId = c.id 
LEFT OUTER JOIN gender g ON C.genderId = c.id 
ORDER BY a.CustomerId; 
+0

Всегда ли для гей все поля для клиентов, например, для получения имени и возраста для каждого клиента? – Nathan

+0

@Nathan Проверьте мой ответный ответ .... –

+0

Извините за поздний ответ. Огромное спасибо, это то, что я хочу! – Nathan

0

Попробуйте это:

SELECT c.id as 'customer id', info.value as 'Customer Name' 
FROM customers c JOIN customer_info info 
ON c.id = info.id_customer 
0
SELECT id_customer, value FROM customers_info WHERE key LIKE 'name' 
+0

Если OP просто хочет идентификатор клиента и имя клиента (что, как он кажется, он делает), то это, безусловно, самый простой способ решить эту проблему. Хороший первый пост :) – AeroX

0

использовать Inner присоединиться или присоединиться к .. результат пересекаются// внутреннее соединение и присоединиться оба идентичны

Попробуйте

SELECT c.id as 'Id', i.value as 'Name' 
FROM customers c INNER JOIN customer_info AS i 
ON c.id = i.id_customer 

// OR 

SELECT c.id as 'Id', i.value as 'Name' 
FROM customers c INNER JOIN customer_info AS i 
ON c.id = i.id_customer 
GROUP BY i.id_customer 
0

Попробуйте этот запрос:

select ci.value 
from customers_info ci 
INNER JOIN customers c 
    ON c.id = ci.id_customer 
WHERE ci.key IN ['name']; 
0
DROP TABLE IF EXISTS eav_hell; 

CREATE TABLE eav_hell 
(id_customer INT NOT NULL 
,attribute VARCHAR(12) NOT NULL 
,value VARCHAR(12) NOT NULL 
,PRIMARY KEY(id_customer,attribute) 
); 

INSERT INTO eav_hell VALUES 
(1,'name','Doe'), 
(1,'age',25), 
(1,'city','NY'), 
(2,'name','Smith'); 

SELECT id_customer 
    , MAX(CASE WHEN attribute = 'name' THEN value END) name 
    FROM eav_hell 
GROUP 
    BY id_customer; 
+-------------+-------+ 
| id_customer | name | 
+-------------+-------+ 
|   1 | Doe | 
|   2 | Smith | 
+-------------+-------+ 
0
select t1.id,t2.key1 from table1 as t1 inner join table2 as t2 on 
t1.id=t2.id_customer group by t2.key1,t1.id 
having t2.key1 in ('name') 

SQLFiddle

0

Не делайте это слишком сложно. Просто так, как есть:

SELECT C.`id`, CI.`value` from customers_info CI 
JOIN customers C ON = CI.`id_customer` = C.`id` 
WHERE CI.`key` = 'name' 
ORDER BY CI.`id_customer`; 
Смежные вопросы