Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MYSQL] - Uzupełnienie tabeli datami z innej tabeli
Forum PHP.pl > Forum > Bazy danych > MySQL
JakubST
Witam.

Mam dwie tabele:
- test_a (zawiera tylko daty)
- test_b (zawiera daty i jakieś inne dane w tym pole na datę wiążącą z tabelą test_a)

Daty w test_a i test_b mogą się wzajemnie pokrywać, ale mogą nie występować w drugiej z tabeli.
Innymi słowy pełna dowolność kombinacji.

Początkowy stan tabel:

test_a:

  1. CREATE TABLE IF NOT EXISTS `test_a` (
  2. `test_a_data` date NOT NULL
  3. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  4.  
  5. INSERT INTO `test_a` (`test_a_data`) VALUES
  6. ('2013-04-28'),
  7. ('2013-05-03'),
  8. ('2013-05-05'),
  9. ('2013-05-06'),
  10. ('2013-05-07'),
  11. ('2013-05-09'),
  12. ('2013-05-10');


test_b:

  1. CREATE TABLE IF NOT EXISTS `test_b` (
  2. `test_b_data` date NOT NULL,
  3. `test_a_data` date DEFAULT NULL
  4. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  5.  
  6. INSERT INTO `test_b` (`test_b_data`, `test_a_data`) VALUES
  7. ('2013-05-02', NULL),
  8. ('2013-05-05', NULL),
  9. ('2013-05-06', NULL),
  10. ('2013-05-08', NULL);

Muszę połączyć te tabele uzupełniając w test_b pole test_a_data w taki sposób, że:
1. jeżeli data test_b.test_b_data występuje w tabeli test_a, to datę tę przypisuję do test_b.test_a_data
2. jeżeli nie występuje, to test_b.test_a_data muszę uzupełnić najbliższą datą test_a.test_a_data lecz nie większą niż test_b.test_a_data

Pierwszy punkt łatwo zrobić SQL'em:

  1. UPDATE
  2. `test_b`
  3. LEFT JOIN
  4. `test_a`
  5. ON
  6. `test_b`.`test_b_data` = `test_a`.`test_a_data`
  7. SET
  8. `test_b`.`test_a_data` = `test_b`.`test_b_data`
  9. WHERE
  10. `test_a`.`test_a_data` IS NOT NULL


Ale jak zrobić SQL'em punkt 2?

Wynik, którego oczekuję:
  1. INSERT INTO `test_b` (`test_b_data`, `test_a_data`) VALUES
  2. ('2013-05-02', '2013-04-28'),
  3. ('2013-05-05', '2013-05-05'),
  4. ('2013-05-06', '2013-05-06'),
  5. ('2013-05-08', '2013-05-07');


Punkt 2 mogę oczywiście zrobić za pomocą PHP i SQL, ale chciałbym ten punkt załatwić na poziomie MySQL jednym SQL'em.
mmmmmmm
  1. UPDATE test_b JOIN (
  2. SELECT test_b.test_b_data, max(test_a.test_a_data) test_a_data FROM test_b JOIN test_a ON test_a.test_a_data<=test_b.test_b_data GROUP BY 1 )x ON x.test_b_data=test_b.test_b_data
  3. SET test_b.test_a_data=x.test_a_data
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.