2016-01-20 5 views
6

लौटने में शामिल हों, और हम निम्न तालिकाओं है:स्व केवल एक सूची प्रबंधन प्रणाली पर कार्य करना एक रिकॉर्ड

================================================ 
| orders | order_line_items | product_options | 
|--------|-------------------|-----------------| 
| id  | id    | id    | 
| start | order_id   | name   | 
| end | product_option_id |     | 
|  | quantity   |     | 
|  | price    |     | 
|  | event_start  |     | 
|  | event_end   |     | 
================================================ 

मैं एक निश्चित तिथि पर सूची की गणना करने के कोशिश कर रहा हूँ, इसलिए मैं एक आत्म में शामिल होने बनाने की जरूरत है order_line_items में अन्य रिकॉर्ड्स की मात्रा के SUM को उसी product_option_id के साथ मात्रा की तुलना करने के लिए, और जहां ईवेंट प्रारंभ और अंत एक सीमा के भीतर हैं।

तो, एक तिथि 2016/01/20 दिया, मेरे पास है:

SELECT order_line_items.id, order_line_items.product_option_id, order_line_items.order_id FROM order_line_items 
WHERE order_line_items.event_end_date >= '2016-01-20 04:00:00' 
AND order_line_items.event_start_date <= '2016-01-21 04:00:00' 
AND order_line_items.product_option_id IS NOT NULL; 

ऊपर रिटर्न 127 पंक्तियों

जब मैं एक आत्म करने के लिए शामिल हो, तो तरह का प्रयास करें:

SELECT 
order_line_items.id, 
order_line_items.product_option_id, 
order_line_items.order_id, 
order_line_items.quantity, 

other_line_items.other_product_option_id, 
other_line_items.other_order_id, 
other_line_items.other_quantity, 
other_line_items.total 

FROM order_line_items 

JOIN (
    SELECT 
     id, 
     product_option_id AS other_product_option_id, 
     order_id AS other_order_id, 
     quantity AS other_quantity, 
     SUM(quantity) total 
    FROM order_line_items 
    WHERE order_line_items.event_end_date >= '2016-01-20 04:00:00' 
    AND order_line_items.event_start_date <= '2016-01-21 04:00:00' 
) other_line_items ON order_line_items.product_option_id = other_line_items.other_product_option_id 

WHERE order_line_items.event_end_date >= '2016-01-20 04:00:00' 
AND order_line_items.event_start_date <= '2016-01-21 04:00:00' 
AND order_line_items.product_option_id IS NOT NULL; 

यह केवल 1 रिकॉर्ड देता है। आप यहाँ देख के रूप में कर सकते हैं:() रिकॉर्ड के बहुत ही product_option_id अतः यह अंतिम क्वेरी के लिए जोड़ा SUM(...) पंक्तियों

+0

एक सुझाव, आपको दूसरी तालिका का नाम बदलने की आवश्यकता है, क्योंकि सिस्टम भ्रमित हो सकता है, और दूसरे स्थान की आवश्यकता नहीं है, क्योंकि आपके पास उप क्वेरी में कोई है। –

+0

धन्यवाद - दूसरे को हटाकर मुझे और रिकॉर्ड मिला, लेकिन अब लौटाए गए सभी रिकॉर्ड एक ही product_option_id हैं .. अजीब: https: // goo।gl/itL5bF – Laravelian

+0

ठीक है, इसे 'join' विकल्प', try_id = other_order_id और production_order_id = other_production_order_id' –

उत्तर

2

का एक बहुत लौट जाना चाहिए के साथ देखते हैं एक ही पंक्ति में सबक्वेरी बदल जाता है। शायद सबक्वेरी इनमें से किसी एक के लिए की जरूरत: (। मैं स्कीमा या आवेदन अच्छी तरह से कहने के लिए जो समझ में आता है पर्याप्त जानकारी नहीं है)

GROUP BY (id) 
GROUP BY (product_option_id) 
GROUP BY (order_id) 

(कम उपयोग करें, अधिक विशिष्ट, उपनाम, एसक्यूएल order_line_items और other_line_items की लंबाई और समानता के कारण पढ़ने के लिए बहुत कठिन है।)

1

क्या आप वास्तव में निम्नलिखित प्राप्त करना चाहते हैं? :

SELECT product_option_id, sum(quantity) 
FROM order_line_items 
WHERE event_end_date >= '2016-01-20 04:00:00' 
AND event_start_date <= '2016-01-21 04:00:00' 
GROUP BY 1 

मैं नहीं बता सकता कि आप एक आत्म की जरूरत है यहाँ में शामिल होने

0

यह आप क्या चाहते हैं यह बताने के लिए एक नमूना परिणाम के बिना मुश्किल है, लेकिन यह आप के लिए प्रत्येक आदेश के उत्पाद के लिए विकल्पों की मात्रा की तुलना दे देंगे सीमा के भीतर कुल:

SELECT oli.order_id, 
     oli.product_option_id, 
     oli.quantity, 
     po.total_quantity 
    FROM order_line_items oli 
    JOIN (
    SELECT product_option_id, 
      SUM(quantity) total_quantity 
     FROM order_line_items 
    WHERE event_end >= '2016-01-20 04:00:00' 
     AND event_start <= '2016-01-21 04:00:00' 
    GROUP BY product_option_id 
     ) po 
    ON po.product_option_id = oli.product_option_id 
WHERE oli.event_end >= '2016-01-20 04:00:00' 
    AND oli.event_start <= '2016-01-21 04:00:00' 

आप एक आदेश में एक ही product_option की कई पंक्तियां कर सकते हैं, तो आप इस रूप में तो बदलाव करने की आवश्यकता हो सकती:

SELECT oli.order_id, 
     oli.product_option_id, 
     SUM(oli.quantity) order_quantity, 
     po.total_quantity 
    FROM order_line_items oli 
    JOIN (
     SELECT product_option_id, 
      SUM(quantity) total_quantity 
     FROM order_line_items 
     WHERE event_end >= '2016-01-20 04:00:00' 
     AND event_start <= '2016-01-21 04:00:00' 
    GROUP BY product_option_id 
     ) po 
     ON po.product_option_id = oli.product_option_id 
    WHERE oli.event_end >= '2016-01-20 04:00:00' 
    AND oli.event_start <= '2016-01-21 04:00:00' 
GROUP BY oli.order_id, 
     oli.product_option_id 
0

जो मैं समझता हूं उससे आपको वास्तव में orders और product_optionsorder_line_items तालिका में शामिल होना चाहिए।

आपकी क्वेरी को कुछ तिथियों के बीच आदेशों की मात्रा के लिए इस तरह कुछ दिखना चाहिए।

SELECT product_options.id, production_options.name, SUM(order_line_items.quantity) 
FROM order_line_items 
LEFT JOIN product_options ON production_options.id=order_line_items.product_option_id 
LEFT JOIN orders ON orders.id=order_line_items.order_id 
WHERE orders.start>='SOME DATETIME' AND orders.end<='SOME DATETIME' 
GROUP BY product_options.id 

इसके अलावा, बस एक टिप्पणी, product_options शायद सिर्फ products नामित किया जाना चाहिए। जीत के लिए छोटे टेबल नाम!

+0

आदेश दिया गया है मैंने अभी अच्छी टेबल नामों के बारे में और सोचा था। मैं 'ऑर्डर', 'item', और 'order_item' के साथ जाऊंगा। – fiddlestacks

संबंधित मुद्दे