2014-03-28 38 views
0

我有一個在線商店,兩個視圖,因爲我的產品可能來自我的包表或會話表。價格從價格表中加入。有條件的mysql表視圖

這兩個視圖自己工作正常,但是當我結合使用時,我得不到任何結果。 我希望我的貨運人員只能看到他應該出貨的物品,而不是數字物品,即交貨格式等於'DVD'的物品。

會話視圖:

select 
     `ats_store`.`order`.`payment_type` AS `payment_type`, 
     `production_www`.`paypal_transactions`.`createdOn` AS `order_date`, 
     `production_www`.`paypal_transactions`.`FIRSTNAME` AS `firstname`, 
     `production_www`.`paypal_transactions`.`LASTNAME` AS `lastname`, 
     `ats_store`.`order`.`id` AS `order_id`, 
     `ats_store`.`order`.`customerid` AS `customerid`, 
     `ats_store`.`order`.`shipping_address_id` AS `shipping_address_id`, 
     `ats_store`.`order`.`status` AS `status`, 
     `ats_store`.`order_items`.`product_id` AS `product_id`, 
     `ats_store`.`shipping_address`.`country` AS `country`, 
     `ats_store`.`shipping_address`.`street_1` AS `street1`, 
     `ats_store`.`shipping_address`.`street_2` AS `street2`, 
     `ats_store`.`shipping_address`.`street_3` AS `street3`, 
     `ats_store`.`shipping_address`.`city` AS `city`, 
     `ats_store`.`shipping_address`.`state_and_province` AS `state`, 
     `ats_store`.`shipping_address`.`zip_code` AS `zip`, 
     group_concat(`production_cache_salesforce_repl`.`ats_conference_session__c`.`Name`, 
      '(', 
      `price`.`Delivery_Format__c`, 
      ')' 
      order by `production_cache_salesforce_repl`.`ats_conference_session__c`.`sort_code__c` ASC 
      separator ',') AS `session_products` 
    from 
     (((((`ats_store`.`order` 
     left join `ats_store`.`shipping_address` ON ((`ats_store`.`shipping_address`.`id` = `ats_store`.`order`.`shipping_address_id`))) 
     join `ats_store`.`order_items` ON ((`ats_store`.`order_items`.`order_id` = `ats_store`.`order`.`id`))) 
     join `production_cache_salesforce_repl`.`ats_store_price__c` `price` ON ((`price`.`Id` = `ats_store`.`order_items`.`product_id`))) 
     join `production_cache_salesforce_repl`.`ats_conference_session__c` ON ((`production_cache_salesforce_repl`.`ats_conference_session__c`.`Id` = convert(`price`.`ATS_Conference_Session__c` using utf8)))) 
     left join `production_www`.`paypal_transactions` ON ((`production_www`.`paypal_transactions`.`id` = `ats_store`.`order`.`paypal_transaction_id`))) 
    where 
     ((`ats_store`.`order`.`shipping_address_id` <> -(1)) 
      and (`production_www`.`paypal_transactions`.`COMMENT1` = 'ATS Web Store') 
      and (`production_www`.`paypal_transactions`.`RESPMSG` = 'Approved') 
      and (`price`.`Delivery_Format__c` = 'DVD')) 
    group by `ats_store`.`order`.`id` 
    order by `production_www`.`paypal_transactions`.`createdOn` 

包裝查看:

select 
     `ats_store`.`order`.`payment_type` AS `payment_type`, 
     `production_www`.`paypal_transactions`.`createdOn` AS `order_date`, 
     `production_www`.`paypal_transactions`.`FIRSTNAME` AS `firstname`, 
     `production_www`.`paypal_transactions`.`LASTNAME` AS `lastname`, 
     `ats_store`.`order`.`id` AS `order_id`, 
     `ats_store`.`order`.`customerid` AS `customerid`, 
     `ats_store`.`order`.`shipping_address_id` AS `shipping_address_id`, 
     `ats_store`.`order`.`status` AS `status`, 
     `ats_store`.`order_items`.`product_id` AS `product_id`, 
     `ats_store`.`shipping_address`.`country` AS `country`, 
     `ats_store`.`shipping_address`.`street_1` AS `street1`, 
     `ats_store`.`shipping_address`.`street_2` AS `street2`, 
     `ats_store`.`shipping_address`.`street_3` AS `street3`, 
     `ats_store`.`shipping_address`.`city` AS `city`, 
     `ats_store`.`shipping_address`.`state_and_province` AS `state`, 
     `ats_store`.`shipping_address`.`zip_code` AS `zip`, 
     `price`.`Delivery_Format__c` AS `delivery_format`, 
     group_concat(`production_cache_salesforce_repl`.`ats_store_package__c`.`Package_Code__c`, 
      '(', 
      `price`.`Delivery_Format__c`, 
      ')' 
      order by `production_cache_salesforce_repl`.`ats_store_package__c`.`Package_Code__c` ASC 
      separator ',') AS `package_products` 
    from 
     (((((`ats_store`.`order` 
     left join `ats_store`.`shipping_address` ON ((`ats_store`.`shipping_address`.`id` = `ats_store`.`order`.`shipping_address_id`))) 
     join `ats_store`.`order_items` ON ((`ats_store`.`order_items`.`order_id` = `ats_store`.`order`.`id`))) 
     join `production_cache_salesforce_repl`.`ats_store_price__c` `price` ON ((`price`.`Id` = `ats_store`.`order_items`.`product_id`))) 
     join `production_cache_salesforce_repl`.`ats_store_package__c` ON ((`production_cache_salesforce_repl`.`ats_store_package__c`.`Id` = convert(`price`.`ATS_Store_Package__c` using utf8)))) 
     left join `production_www`.`paypal_transactions` ON ((`production_www`.`paypal_transactions`.`id` = `ats_store`.`order`.`paypal_transaction_id`))) 
    where 
     ((`ats_store`.`order`.`shipping_address_id` <> -(1)) 
      and (`production_www`.`paypal_transactions`.`COMMENT1` = 'ATS Web Store') 
      and (`production_www`.`paypal_transactions`.`RESPMSG` = 'Approved') 
      and (`price`.`Delivery_Format__c` = 'DVD')) 
    group by `ats_store`.`order`.`id` 
    order by `production_www`.`paypal_transactions`.`createdOn` 

下面是用兩種觀點查詢:

select *,group_concat(pv.package_products,',',sv.session_products) as products from ats_store.shipping_orders_sessions_view sv,ats_store.shipping_orders_packages_view pv 
where sv.order_id = pv.order_id 
group by sv.order_id 

如果我從視圖中除去and (價格. Delivery_Format__c = 'DVD')我可以得到訂單,但數字並顯示DVD產品。我只希望我的航運人員看到他應該出貨的物品,DVD。

回答

0

假設你的兩個視圖是乾淨和工作:

讓我們對查詢加入他們的工作。

這是你有什麼,重寫爲使用顯式連接。

select *,   /* query with problems */ 
     group_concat(pv.package_products,',',sv.session_products) as products 
    from ats_store.shipping_orders_sessions_view sv 
    join ats_store.shipping_orders_packages_view pv on sv.order_id = pv.order_id 
group by sv.order_id 

這裏有什麼問題?

首先,專業提示:請勿在複雜查詢中使用select *

其次,select *保證輸出結果集中的隨機廢話,因爲您使用的是有害的非標準MySQL hackstension。閱讀:http://dev.mysql.com/doc/refman/5.5/en/group-by-extensions.html您應該在GROUP BY子句中提到結果集中的每個非聚合列。

第三,你可能想

GROUP_CONCAT(CONCAT(pv.package_products,',',sv.session_product)) AS products 

,以確保您使用的是聚合函數GROUP_CONCAT()正常。

所以這裏是一個更好的查詢。

select sv.order_id, 
     GROUP_CONCAT(CONCAT(pv.package_products,',',sv.session_product)) AS products 
    from ats_store.shipping_orders_sessions_view sv 
    join ats_store.shipping_orders_packages_view pv on sv.order_id = pv.order_id 
group by sv.order_id 

EDIT:這將產生具有每個不同order_id一行出現提及的所有產品中的每個順序的結果集。如果您希望只包含某些項目,例如那些帶有delivery_format ='DVD'的項目,則需要添加一個WHERE子句。它看起來像你的包視圖公開該列。所以試試這個:

select sv.order_id, 
     GROUP_CONCAT(CONCAT(pv.package_products,',',sv.session_product)) AS products 
    from ats_store.shipping_orders_sessions_view sv 
    join ats_store.shipping_orders_packages_view pv on sv.order_id = pv.order_id 
where pv.delivery_format = 'DVD' 
group by sv.order_id 

我不明白你的模式足以給你比這更好的建議。我可以看到你的觀點非常複雜。

+0

謝謝!但我仍然得到不是DVD的專業知識。我只想得到DVD,因爲我的航運人員只應該看到這些。很好的解釋! –