2010-07-23 50 views
1

您好,我在尋找解決方案時遇到了問題。複雜的SQL查詢::從乘法表內聯顯示數據

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

AAA,還有一兩件事,它通過PHP的動態。

+2

你怎麼知道哪一個是1st/2nd/3rd/etc訂閱?是否有每個客戶的限制,否則這必須是動態的,以適應訂閱最多的客戶... – 2010-07-23 18:56:21

回答

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引擎進行分析以獲取這樣的數組並呈現數據。

謝謝