MySQL - dönüştürmek ve sorguda tarihlerini karşılaştırmak

1 Cevap php

Ben birçok özellik, liste sonuç tabloları ile birlikte, bir futbol sitesi cadı üzerinde çalışıyorum. Tabloları (cadı yeni sezon, vb 2009/2010 ve 2008/2009 gibi, başlar her oluşturulur) mevsim (sezon isim, vb) ve mermi arasında ayrılır

mermi tablo bir başlangıç ​​tarihi ve bitiş tarihi vardır, ve ben dinamically ben web sitesi Önyüzde çalışmak gerektiğini wich yuvarlak bilmek zorunda tek yolu aynı sezon ilişkin kalan mermi ile bu tarihleri ​​karşılaştırarak olduğunu.

Tüm veriler bir xml getirilen ve tarihleri ​​şöyle:

2009-08-16

Yani, benim 2 sorunları:

  • tarihlerini karşılaştırmak (ve muhtemelen on-the-fly çevirebiliriz) ve cadı yuvarlak büyük bitiş tarihi vardır bulmak;
  • Doğru yuvarlak olsun (bazı turlarda zaten veritabanında olabilir ama geçerli yuvarlak başka öncesinde olanlar, ne demek istediğimi biliyorum olabilir)

Ben uzman veya SQL ile bir şey değilim, bu yüzden siz bunu nasıl bilmek istiyorum.

İşte benim geçerli sorgu var:

SELECT seasons.competition_id AS cid, 
       seasons.id AS sid, 
       rounds.id AS rid, 
       seasons.start_date AS sstart, 
       seasons.end_date AS send, 
       rounds.start_date AS rstart, 
       rounds.end_date AS rend, 
       round_groups.id AS rgid 
  FROM seasons 
INNER JOIN rounds ON seasons.id=rounds.season_id 
LEFT JOIN round_groups ON rounds.id=round_groups.round_id

ps: Belirli bir sezon UEFA ve Şampiyonlar gibi, gruba ayrılmıştır zaman kullanılır, ben söylemeyi unutmuşum round_groups tablosunu görebilirsiniz.

EDIT:

Bazı yarışmalar sezon sponsoru ilişkin kendi adını değiştirmek çünkü sezon bir kez sezon başı güncellenen veritabanı üzerinde bir giriştir. Kez sezon başına yuvarlak değişiklikler, en azından, ama fazla değişiklik olabilir. UEFA gibi bazı yarışmalarda, onlar yine, wich 3 farklı turlarda neden olacak bazı ilk eleme tur, daha sonra bir grup fazı ve ardından ortadan kaldırılması var. Nihai çıktı her sezon ile ilgili şu anda aktif her turda bir liste olmalıdır.

1 Cevap

(Uygun endeksleri veya kısıtlamaları olmadan) adlı Aşağıdaki tablo tanımları varsayalım

CREATE TABLE seasons (
  id int auto_increment,  
  competition_id int,  
  start_date DATE,  
  end_date DATE, 
  description varchar(32),
  primary key(id)
)

CREATE TABLE rounds (
  id int auto_increment,  
  season_id int,  
  start_date DATE,  
  end_date DATE,    
  description varchar(32),
  primary key(id)
)

Ve bazı örnek veriler

INSERT INTO seasons (competition_id,start_date,end_date,description) VALUES
  (1, '2007-3-15', '2007-9-15', 'FooCup 2007'),  
  (1, '2008-3-7', '2007-9-21', 'FooCup 2008'),  
  (1, '2009-4-1', '2007-9-21', 'FooCup 2009'),    
  (2, '2009-1-1', '2009-12-20', 'xyz 2009') 

INSERT INTO rounds (season_id, start_date, end_date, description) VALUES
  (1, '2007-3-15', '2007-4-15', 'foo 2007 1'),
  (1, '2007-4-16', '2007-8-15', 'foo 2007 2'),
  (1, '2007-8-16', '2007-9-15', 'foo 2007 3'),  
  (2, '2008-3-7', '2008-4-21', 'foo 2008 1'),
  (2, '2008-4-21', '2008-8-16', 'foo 2008 2'),
  (2, '2008-8-17', '2008-9-21', 'foo 2008 3'),
  (3, '2009-4-1', '2009-5-1', 'foo 2009 1'),
  (3, '2009-5-2', '2009-8-1', 'foo 2009 2'),
  (3, '2009-8-2', '2009-9-21', 'foo 2009 3'),
  (4, '2009-1-1', '2009-12-20', 'xyz ')

You a fix time/date (fd) and want the records having this fd between start_date and end_date. BETWEEN ... AND ... tests exactly that and works with date/time values. E.g.

SELECT
  id, description 
FROM
  round as r
WHERE
  '2008-6-17' BETWEEN  r.start_date AND r.end_date

returning the records for all rounds (for all competitions) at that time.
Now you JOIN this on the season_id with the seasons table. And limit the results to a certain competition_id (if you want).

SELECT
  r.description as rd, r.start_date, r.end_date    
FROM
  rounds as r  
JOIN
  seasons as s  
ON
  r.season_id=s.id
WHERE
  '2009-6-17' BETWEEN  r.start_date AND r.end_date  
  AND s.competition_id=1

edit: sorry, misread the question.... Assuming you know the competition_id and have a fix date (2009-08-16), you can get the season.id with

SELECT
  s.id  
FROM
  seasons as s  
WHERE
  s.competition_id=1
  AND '2009-08-16' BETWEEN s.start_date AND s.end_date

Şimdi bu sezonda tüm mermi almak için season.id = rounds.season_id JOIN olabilir.

SELECT
  r.id  
FROM
  seasons as s  
JOIN
  rounds as r  
ON
  s.id=r.season_id
WHERE
  s.competition_id=1
  AND '2009-08-16' BETWEEN s.start_date AND s.end_date

(rounds:id 7,8,9 in this case).
The simplest option to limit the result to the highest round.id is to let MySQL order rounds by rounds.id in descending order and limit the result to one record.

SELECT
  r.id  
FROM
  seasons as s  
JOIN
  rounds as r  
ON
  s.id=r.season_id
WHERE
  s.competition_id=1
  AND '2009-08-16' BETWEEN s.start_date AND s.end_date
ORDER BY
  r.id DESC
LIMIT
  1

EXPLAIN SELECT ... Emin sorgusu too verimsiz değil yapmak için kullanabilirsiniz ...