2012-03-13 6 views
5

मैं सार्वजनिक परिवहन प्रणाली के लिए एक प्रश्न लिखने की कोशिश कर रहा हूं जो मूल और गंतव्य स्टॉप संख्याओं को इनपुट करते समय मार्गों की एक सूची आउटपुट करेगा।नेस्टेड MySQL क्वेरीज़

यहाँ मेरी MySQL तालिका है:

mysql> select * from route_timings; 
+----+--------------+-------------+--------------+----------------+ 
| ID | route_number | stop_number | arrival_time | departure_time | 
+----+--------------+-------------+--------------+----------------+ 
| 1 |   54 |   1 | 10:00:00  | 10:05:00  | 
| 2 |   54 |   2 | 11:00:00  | 11:05:00  | 
| 3 |   54 |   3 | 12:00:00  | 12:05:00  | 
| 4 |   55 |   3 | 13:00:00  | 13:05:00  | 
| 5 |   55 |   4 | 14:00:00  | 14:05:00  | 
| 6 |   55 |   5 | 15:00:00  | 15:05:00  | 
| 7 |   60 |   3 | 10:00:00  | 10:05:00  | 
| 8 |   60 |   2 | 11:00:00  | 11:05:00  | 
| 9 |   60 |   1 | 12:00:00  | 12:05:00  | 
+----+--------------+-------------+--------------+----------------+ 
9 rows in set (0.01 sec) 

मेरा प्रश्न है:

mysql> desc route_timings; 
+----------------+---------+------+-----+---------+----------------+ 
| Field   | Type | Null | Key | Default | Extra   | 
+----------------+---------+------+-----+---------+----------------+ 
| ID    | int(11) | NO | PRI | NULL | auto_increment | 
| route_number | int(11) | NO |  | NULL |    | 
| stop_number | int(11) | NO |  | NULL |    | 
| arrival_time | time | YES |  | NULL |    | 
| departure_time | time | YES |  | NULL |    | 
+----------------+---------+------+-----+---------+----------------+ 
5 rows in set (0.00 sec) 

यहाँ नमूना मान हैं मैं ROUTE_NUMBER की कि stop_number 1 और stop_number 3 होते हैं सूचीबद्ध करने के लिए चाहते हैं, तो मैं इस तरह की एक क्वेरी लिखेंगे:

SELECT DISTINCT `route_number` FROM `route_timings` WHERE `route_number` IN (
    SELECT `route_number` FROM `route_timings` WHERE `stop_number`=1 
) AND `route_number` IN (
    SELECT `route_number` FROM `route_timings` WHERE `stop_number`=3 
); 

हालांकि, उपर्युक्त क्वेरी केवल वापसी होगी रूट स्टॉप जिसमें दो स्टॉप होते हैं, न कि मार्ग जहां स्रोत स्टॉप (1) गंतव्य स्टॉप (3) से पहले पहुंच जाएगा।

क्वेरी वापसी होगी निम्नलिखित:

+--------------+ 
| route_number | 
+--------------+ 
|   54 | 
|   60 | 
+--------------+ 

ROUTE_NUMBER 60 1 से शुरू नहीं करता है और 3 के लिए जाना लेकिन इसके बजाय 3 से शुरू होता है और 1. को जाता है कृपया किसी की मदद कर सकते हैं मुझे लगता है कि थोड़ा जोड़ने क्वेरी करें ताकि क्वेरी केवल server_numbers को आउटपुट करे जहां stop_number 1 के लिए आगमन_टाइम stop_number 3 के लिए आगमन_टाइम से कम है।

अग्रिम धन्यवाद। -Shain

उत्तर

1

में क्या किया है की तरह कुछ के बारे में कैसे की अनुमति देता है के साथ काम सम्मेलन का उपयोग किया जाता है लेकिन सिद्धांत स्पष्ट होना चाहिए लेकिन सिद्धांत स्पष्ट होना चाहिए

+1

हटाते हैं जो मैं ढूंढ रहा था। आपका बहुत बहुत धन्यवाद। –

0

उपयोग:

SELECT DISTINCT `route_number` FROM `route_timings` WHERE `stop_number` IN (1,3) 

नोट: क्यों प्रस्थान है> ARRIVAL_TIME से ??

+0

मुझे लगता है कि ऐसा इसलिए होता है क्योंकि परिवहन नोड पर आता है, इसके बाद शीघ्र ही – Tung

+0

आता है आगमन समय वह समय होता है जब बस बस स्टॉप और प्रस्थान_टाइम आता है जब वह समय होता है बस यात्रियों को उठाए जाने के बाद बस स्टॉप छोड़ देता है। –

+0

@Dax, आपके द्वारा सुझाई गई क्वेरी यह सुनिश्चित नहीं करेगी कि दोनों चरण 1 और 2 रूट में दिखाई देंगे। यह उन मार्गों को वापस कर देगा जिनमें से दो में से कोई भी शामिल है। + -------------- + | मार्ग_नंबर | + -------------- + | 54 | | 55 | | 60 | + -------------- + –

1
SELECT DISTINCT `route_number` R1 FROM R1.`route_timings` WHERE R1.`stop_number` =3 AND R1.`route_number` IN (
SELECT `route_number` R2 FROM `route_timings` WHERE R2.`stop_number`=1 AND R2.`arrival_time` > R1.`arrival_time` 
); 

मैं अभी यह कोशिश नहीं कर सकता, लेकिन मुझे उम्मीद है कि वाक्यविन्यास सही है। मैंने जो किया है वह उन मार्गों का चयन किया जाता है जो 3 से गुज़रते हैं और फिर मैंने जांच की है कि क्या वे बाद में 1 पर रुकते हैं।

select fromStop.RouteNumber 
from routeTimings fromStop 
    inner join routeTimings toStop on toStop.RouteNumber = fromStop.RouteNumber and toStop.StopNumber = 3 and toStop.ArrivalTime > fromStop.DepartureTime 
where fromStop.StopNumber = 1 

नोट इस एसक्यूएल सर्वर वाक्य रचना और नाम का उपयोग किया जाता है करने के लिए समायोजित: मैं आमतौर पर SQLite कि जोड़ती querys के लिए टेबल नाम बदलने के लिए है कि मैं चयन route_number R2

+0

मुझे यकीन नहीं है कि आप इसे MySQL में कर सकते हैं क्योंकि यह निम्न त्रुटि 'ERROR 1146 (42S02) देता है: तालिका' R1.route_timings ' अस्तित्व में नहीं है। –

+0

मैंने अभी यह काम खोजा है यदि आप सभी उद्धरण चिह्न – Erpheus

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