MySQL

2011-04-13 24 views
5

ile seçili bir sorguda CASE, WHEN, THEN, END tuşlarını kullanma Beyzbol ile ilgili bir web sitesinde çalışıyorum. İki beyzbol takımları için bir vuruş sırası içeren bir tablo:MySQL

  1. Vuruş Sipariş 1-9 — Dışarıda:

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

    Vuruş düzeni 1 ve Bu, aşağıdaki mantık tekabül 20 arasında bir tam sayı olduğu Takım Sıralaması

  2. Batting Sipariş 10 — Deplasman Takım Sürahi
  3. Batting Sipariş 11-19 — Ev Sahibi Takım Sıralaması
  4. Vuruş Sipariş 20 — Ana Takım Sürahi

etkin alan tepenin üzerine sürahi ve plaka üzerinde meyilli temsil eden bir Tinyint, 0 ya da 1 'dir.

Bilinen Bilgiler: Her zaman bir takımdan bir aktif sürahi ve karşı takımdan bir aktif meyilli olacak.

Ben battingOrder içinde sonraki hamuru karşılık gelen bir ev sahibi takım oyuncu için bir satır döndüren bir sorgu yazmak gerekiyor.

Örnek (bu sonra etken Vurucunun battingOrder oluşur biri): battingOrder 13 oyuncu aktif ise, sorgu vuruş için oyuncu döndürmelidir

  1. 14.
  2. halinde battingOrder 19'daki oyuncu aktiftir, sorgu, oyuncuyu vuruş sırasına göre 11 (oyuncu için ilk oyuncuya geri döner) döndürmelidir.

Daha önce VAKA sorgusu hiç kullanmadıysanız, ama şu geldi:

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; 

iş gibi görünüyor, ama ne kenar durumlarda ve/veya tuzaklar ı yürüdü içine? Bu verimli mi? Özellikle de iç içe geçmiş bir sorgu kullanmayan sorunumun çözümü ile ilgileniyorum.

cevap

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 

Aslında, o kadar gibi uzak hem ev idare ve yapabilir:

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

Bu doğru görünmüyor. Neden kimlik sütununa bakıyorsunuz? BattingOrder sütunu olmalı. – Stephen

+0

@Stephen - Evet. Bu bir yazım hatası. Sabit. – Thomas

+0

Eh, sorgunuzu hiç sonuç vermeden kullandım. Sipariş pozisyonu 19'u aktif olarak harekette bir oyuncu var, ama her iki sorgunun da bir sonucu yok. – Stephen