MySQL

2011-04-13 3 views
5

के साथ एक चुनिंदा क्वेरी में केस, WHEN, THEN, END का उपयोग करके मैं बेसबॉल संबंधित वेबसाइट पर काम कर रहा हूं। मैं दो बेसबॉल टीमों के लिए एक बल्लेबाजी लाइनअप के साथ एक मेज है:MySQL

  1. बल्लेबाजी क्रम 1-9 — दूर:

    +----+----------+--------------+--------+ 
    | id | playerId | battingOrder | active | 
    +----+----------+--------------+--------+ 
    

    बल्लेबाजी क्रम 1 और 20. यह निम्न तर्क से मेल खाती है के बीच एक पूर्णांक है टीम लाइनअप

  2. बल्लेबाजी क्रम 10 — दूर टीम घड़ा
  3. बल्लेबाजी क्रम 11-19 — होम टीम लाइनअप
  4. बल्लेबाजी क्रम 20 — होम टीम घड़ा

सक्रिय क्षेत्र एक tinyint 0 या 1, टीले पर घड़ा और थाली पर बल्लेबाज का प्रतिनिधित्व करता है।

ज्ञात तथ्य: हमेशा एक टीम से एक सक्रिय पिचर और विपरीत टीम से एक सक्रिय बल्लेबाज रहेगा।

मैं एक प्रश्न है कि एक घर टीम के खिलाड़ी है कि battingOrder में अगले बल्लेबाज से मेल खाती है के लिए एक पंक्ति रिटर्न लिखने के लिए की जरूरत है। (एक है कि कि के बाद होता सक्रिय बल्लेबाज के battingOrder)

उदाहरण:

  1. तो battingOrder 13 में खिलाड़ी सक्रिय है, क्वेरी बल्लेबाजी क्रम में खिलाड़ी लौट जाना 14.
  2. हैं बल्लेबाजी में खिलाड़ी ऑर्डर 1 सक्रिय है, क्वेरी बल्लेबाजी क्रम 11 में खिलाड़ी को वापस करनी चाहिए (लाइनअप टीम के लिए पहले खिलाड़ी को वापस लूप)।

मैं पहले एक मामला क्वेरी उपयोग नहीं किया है, लेकिन मैं निम्नलिखित के साथ आया था:

SELECT * 
    FROM lineups 
WHERE battingOrder = 
     CASE (
      SELECT battingOrder 
      FROM lineups 
      WHERE battingOrder > 10 AND active = 1 
      LIMIT 1 
     ) 
     WHEN 11 THEN 12 
     WHEN 12 THEN 13 
     WHEN 13 THEN 14 
     WHEN 14 THEN 15 
     WHEN 15 THEN 16 
     WHEN 16 THEN 17 
     WHEN 17 THEN 18 
     WHEN 18 THEN 19 
     WHEN 19 THEN 11 
     END 
LIMIT 1; 

यह काम करने के लिए लगता है, लेकिन क्या बढ़त मामलों और/या नुकसान मैं चला गया है में? क्या यह कुशल है? मैं अपनी समस्या के समाधान में दिलचस्पी रखने वाला कण हूं जो घोंसला वाली क्वेरी का उपयोग नहीं करता है।

उत्तर

7
Select LNext.player As NextPlayer 
From lineups As L 
    Left Join lineups As LNext 
     On LNext.BattingOrder Between 11 And 20 
      And LNext.BattingOrder = Case 
             When L.BattingOrder = 19 Then 11 
             Else L.BattingOrder + 1 
             End 
Where L.battingOrder Between 11 And 20 
    And L.active = 1 

वास्तव में, आप यह दोनों घर संभालने के लिए और दूर तो तरह कर सकता है:

Select LNext.player As NextPlayer 
From lineups As L 
    Left Join lineups As LNext 
     On LNext.BattingOrder = Case 
            When L.BattingOrder = 19 Then 11 
            When L.BattingOrder = 9 Then 1 
            Else L.BattingOrder + 1 
            End 
Where L.active = 1 
+0

यह सही नहीं लगता है। आप आईडी कॉलम क्यों देख रहे हैं? यह बल्लेबाजी ऑर्डर कॉलम होना चाहिए। – Stephen

+0

@ स्टीफन - हां। यह एक टाइपो है। फिक्स्ड। – Thomas

+0

ठीक है, मैंने आपकी क्वेरी verbatim का कोई परिणाम नहीं दिया है। मेरे पास बल्लेबाजी ऑर्डर स्थिति 19 में सक्रिय है, लेकिन आपके दोनों प्रश्नों का कोई परिणाम नहीं है। – Stephen

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