2010-07-23 2 views
1

Привет, у меня есть возможность найти решение.Комплексный SQL-запрос :: отображение данных inline из таблиц с умножением

У меня есть 3 таблицы:

  1. клиентов
    • customer_id
    • customer_name
  2. связь
    • subscription_id
    • customer_id
  3. подписка

Один клиент может иметь отношения со многими подписками и я хочу, чтобы отобразить данные следующим образом:

customer_id, customer_name, subscription_first, subscription_second, subscription_n 

... все в одной строке.

Может ли кто-нибудь мне помочь:?

Хорошо, прежде всего, спасибо за помощь :)

я сделал что-то вроде этого, и его работы :)

SELECT `main_table`.*, `customer_lastname_table`.`value` AS `customer_lastname`, `customer_firstname_table`.`value` AS `customer_firstname`, IF(main_table.customer_id = 0, 1, 2) AS `type`, `store`.`group_id`, `store`.`website_id`, `subscription_table_one`.`subscription_code`, `subscription_table_two`.`subscription_code` FROM `newsletter_subscriber` AS `main_table` 

LEFT JOIN `customer_entity_varchar` AS `customer_lastname_table` ON customer_lastname_table.entity_id=main_table.customer_id 
AND customer_lastname_table.attribute_id = 7 

LEFT JOIN `customer_entity_varchar` AS `customer_firstname_table` ON customer_firstname_table.entity_id=main_table.customer_id 
AND customer_firstname_table.attribute_id = 5 

INNER JOIN `core_store` AS `store` ON store.store_id = main_table.store_id 
LEFT JOIN `b_newsletter_relations` AS `relation_table` ON relation_table.customer_id=main_table.customer_id 
LEFT JOIN `b_newsletter_subscriptions` AS `subscription_table_one` ON subscription_table_one.subscription_id=relation_table.subscription_id 
LEFT JOIN `b_newsletter_subscriptions` AS `subscription_table_two` ON subscription_table_one.subscription_id=relation_table.subscription_id 
GROUP BY `customer_id` 

ааа, и еще одна вещь, это динамический с помощью PHP.

+2

Как вы узнаете, что является подписью 1-го/2-го/3-го/и т.д.? Существует ли ограничение для каждого клиента, иначе это должно быть динамичным, чтобы разместить клиента с наибольшим количеством подписчиков ... –

ответ

2

Вы можете использовать удобную функцию GROUP_CONCAT, доступную с MySQL. Ниже приведено решение.

create table customer (customer_id int, customer_name varchar(100)); 

create table subscriptions (subscription_id int, subscription_name varchar(100)); 

create table customer_relation (subscription_id int, customer_id int); 

insert into customer values (1,'cust1'); 
insert into customer values (2,'cust2'); 

insert into subscriptions values (1,'sub1'); 
insert into subscriptions values (2,'sub2'); 
insert into subscriptions values (3,'sub3'); 

insert into customer_relation values (1,1); 
insert into customer_relation values (2,1); 
insert into customer_relation values (3,1); 

insert into customer_relation values (1,2); 
insert into customer_relation values (3,2); 


SELECT c.customer_id 
    , c.customer_name 
    , GROUP_CONCAT(s.subscription_name ORDER BY s.subscription_name) subs 
    FROM customer c 
    , subscriptions s 
    , customer_relation x 
WHERE x.subscription_id = s.subscription_id 
    AND x.customer_id = c.customer_id 
GROUP BY 
     c.customer_id 
    , c.customer_name; 

Результаты:

customer_id customer_name subs 
1    cust1   sub1,sub2,sub3 
2    cust2   sub1,sub3 
-1

вы можете использовать союз. Что-то вроде

SELECT * FROM CUSTOMER WHERE customer_id = ... UNION SELECT * FROM Subscriptions WHERE subscription_id IN (SELECT subscription_id WHERE customer_id = ...) 

Я не знаю SQL на всех, так что может быть много ошибок, но я думаю, что это делает работу.

0

Если бы вы могли использовать доктриной эта ситуация может быть обработана очень легко. Однако сама доктрина возвращает объект в таком случае, так, как следует

 Array 
(
    [0] => Array 
     (
      [name] => customer_name 
      [id] => customer_id 
      [subscription] => Array 
       (
        [0] => subscription_first 
        [1] => subscription_second 
        [2] => subscription_third 
       ) 

     ) 

    [1] => Array 

    (
     [name] => customer_name 
     [id] => customer_id 
     [subscription] => Array 
      (
       [0] => subscription_first 
       [1] => subscription_second 
       [2] => subscription_third 
      ) 

    ) 

[2] => Array 
    (
     [name] => customer_name 
     [id] => customer_id 
     [subscription] => Array 
      (
       [0] => subscription_first 
       [1] => subscription_second 
       [2] => subscription_third 
      ) 



    ) 

) 

если вы можете сделать такой массив, то это будет очень просто для Вас, чтобы сделать такую ​​презентацию. Кто-то может написать сложный запрос с многоуровневыми объединениями, что позволит увеличить ситуацию с никчемной бутылкой. Но я предлагаю получить все данные с помощью единого соединения и разбора с помощью php engine, чтобы получить такой массив и представить данные.

Thanks

Смежные вопросы