Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Problem z zapytaniem MySQL
Forum PHP.pl > Forum > Przedszkole
krzesik
Witam, głowię się i głowię i ciągle nie tak mi wychodzi...
Potrzebuję napisać zapytanie, które zwróci mi wynik:

oto przykład, jestem np nauczycielem i mam zajęcia:
sala a jest jest zajęta od 2016-04-21 09:00:00 do 2016-04-21 10:00:00
sala b jest jest zajęta od 2016-04-21 13:00:00 do 2016-04-21 15:00:00

muszę wyciągnąć dane tak aby skrypt nie pozwolił mi na zdublowanie się w czasie, teraz mam tak:

wyjaśnienia:
$str_start_1 - zmienna ze skryptu oznaczająca początek zajęć do zapisu
$str_end_1 - zmienna ze skryptu oznaczająca koniec zajęć do zapisu
str_start - zmienna z bazy oznaczająca początek zajęć
str_end - zmienna z bazy oznaczająca koniec zajęć

zarówno w bazie jak i ze skryptu daty i godziny przesyła jako strtotime, próbowałem też z between ale ta funkcja dla granicznych wartości pobiera również "<=" a taki warunek jest dopuszczalny.......

  1. $dubletzapisu = "SELECT * FROM tabela WHERE
  2. imie_nazwisko LIKE '$imie_nazwisko' and
  3. (
  4. ('$str_start_1' > str_start and '$str_end_1' < str_end) or
  5. ('$str_start_1' < str_start and '$str_end_1' < str_end and '$str_end_1' > str_start) or
  6. ('$str_start_1' < str_start and '$str_end_1' > str_end)
  7. ) ";
mmmmmmm
Daj przykład danych wejściowych (np. na sqlfiddle.com), parametry wejściowe i oczekiwany wynik.
krzesik
Mniej więcej taka struktura tabeli, zapisywane są w niej np nazwiska oraz data/godzina początku i końca
  1. CREATE TABLE `tabela` (
  2. `id_tabela` int(10) NOT NULL AUTO_INCREMENT,
  3. `imie_nazwisko` varchar(50) NOT NULL,
  4. `str_start` text NOT NULL,
  5. `str_end` text NOT NULL,
  6. PRIMARY KEY (`id_tabela`)
  7. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1 ;
  8.  
  9.  
  10. INSERT INTO `tabela` (`id_tabela`, `imie_nazwisko`, `str_start`, `str_end`) VALUES
  11.  
  12. (1, 'Kowalski Adam', '1461232800', '1461236400'),
  13. (2, 'Kowalski Adam', '1461236400', '1461247200');



Podczas dodawania rekordu do tabeli muszę sprawdzić czy dopisywany rekord się nie "nakłada" na wcześniej wpisane. Początek lub koniec dopisywanego rekordu może równać się z początkiem lub końcem istniejącego, ale nie mogą na siebie "zachodzić". Jeśli warunek (ten którego nie umiem napisać) się sprawdzi wyświetlam komunikat z informacją że nie można dodać rekordu bo......
teraz mam to co pisałem wcześniej:
  1. $dubletzapisu = "SELECT * FROM tabela WHERE
  2. imie_nazwisko LIKE '$imie_nazwisko' and
  3. (
  4. ('$str_start_1' > str_start and '$str_end_1' < str_end) or
  5. ('$str_start_1' < str_start and '$str_end_1' < str_end and '$str_end_1' > str_start) or
  6. ('$str_start_1' < str_start and '$str_end_1' > str_end)
  7. ) ";
mmmmmmm
SQLFiddle zaliiczyl ... więc wkleję ci tu skrypty. SPrawdz sobie
  1. CREATE TABLE t(id int NOT NULL PRIMARY KEY AUTO_INCREMENT, nazwisko text NOT NULL, data_start date NOT NULL, data_stop date NOT NULL);
  2.  
  3. INSERT INTO t(nazwisko, data_start, data_stop) VALUES
  4. ('nowak', '2016-01-01', '2016-02-01'),
  5. ('kowal', '2016-02-02', '2016-02-15'),
  6. ('xxx', '2016-02-26', '2016-03-15');

  1. -- sprawdzenie, czy można wpisać dane z okresem od '2016-02-13' do '2016-02-28'
  2. -- jesli wynik pusty, to sie da
  3. SELECT * FROM t WHERE data_stop>'2016-02-13' AND data_start<'2016-02-28';
  4.  
  5. -- jw, ale "pewny" przedział dat
  6. SELECT * FROM t WHERE data_stop>'2016-02-23' AND data_start<'2016-02-25';
krzesik
Super! o to mi chodziło!
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.